java treemap用法_java TreeMap用法
最近工作遇到需要按一个model中不同的列进行排序的问题,查了一下JDK API文档,发现,java中可以排序的工具类和接口共有五个SortedMap 、SortedSet、TreeMap 、TreeSet和Collections,由于我要排序的是一系列model,所以,最后使用了TreeMap对象,而且TreeMap到最后的处理比较自由,可以直接返回TreeMap对象,也可以返回model的一个Collection对象。其它几个类的用法其实都是大同小异,如果java基础较好,看一下API文档很容易明白,只是Collection中需要显式调用sort()方法而已
写理论的东西或者深入的东西就会太多了,而且让人会看得比较烦,这里讲求实用,就不多说了,直接入正体,基本的排序代码如下:
package ChineseSort;
import java.util.Collection;
import java.util.Iterator;
import java.util.SortedMap;
import java.util.TreeMap;
public class TestSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeMap map = new TreeMap();
for(int i=0; i<10; i++) {
String s = ""+(int)(Math.random()*1000);
map.put(s,s);
}
map.put("abcd","abcd");
map.put("Abc", "Abc");
map.put("bbb","bbb");
map.put("BBBB", "BBBB");
map.put("北京","北京");
map.put("中国","中国");
map.put("上海", "上海");
map.put("厦门", "厦门");
map.put("香港", "香港");
map.put("碑海", "碑海");
Collection col = map.values();
Iterator it = col.iterator();
while(it.hasNext()) {
System.out.println(it.next());}}}
代码就不多作解释了,一看就明白,开始放进去10个整数随机数,然后是英文,然后是中文。运行结果如下:
132
205
287
295
39
410
411
464
670
73
Abc
BBBB
abcd
bbb
上海
中国
北京
厦门
碑海
香港
注意,这里的数字排序正常,而英文排序是区分大小写的,这个也是正常的,因为ASCII码中小写字母比大写字母靠后,中文排序则明显的不正确,碑和北明显应该在一起的,而且应该在最前面。这个主要是java中使用中文编码GB2312或者JBK时,char型转换成int型得过程出现了比较大的偏差,很多文章介绍过了,大家可以去网上找一下,这里不多说了,直接寻找解决方案
Java中之所以出现偏差,主要是compare方法的问题,所以这里自己实现Comparator接口,而国际化的问题,使用Collator类来解决。这里先解决中文问题,代码如下:
package ChineseSort;
import java.text.CollationKey;
import java.text.Collator;
import java.util.Comparator;
public class CollatorComparator implements Comparator {
Collator collator = Collator.getInstance();
public int compare(Object element1, Object element2) {
CollationKey key1 = collator.getCollationKey(element1.toString());
CollationKey key2 = collator.getCollationKey(element2.toString());
return key1.compareTo(key2);
}
}
同时修改我们前面完成的TestSort类,找到
TreeMap map = new TreeMap();
修改为
CollatorComparator comparator = new CollatorComparator();
TreeMap map = new TreeMap(comparator);
再次运行该类,运行结果如下:
325
62
653
72
730
757
874
895
909
921
Abc
abcd
bbb
BBBB
碑海
北京
上海
厦门
香港
中国
此时可以看到中文的排序已经完成正常。如果想不让英文区分大小写,则修改CollatorComparator类,找到
element1.toString()
修改为:
element1.toString().toLowerCase()
当然你改成转换成大写的也无所谓了,当然element2.toString()也要同时修改为element2.toString().toLowerCase()。再次运行结果如下:
207
353
656
659
770
789
857
861
931
984
Abc
abcd
bbb
BBBB
碑海
北京
上海
厦门
香港
中国
现在可以看到,排序已经完全符合我们的要求了。如果要反向排序也很容易,遍历的时候倒过来,或者你写两个Comparator的实现类,正向的排序就像我们前面所写的,反向排序就将return key1.compareTo(key2);修改成return -key1.compareTo(key2);,加了个负号,这里你可以直接加个符号看看效果,结果我就不写了,肯定中国是Number One。我还真没找到TreeMap里直接反向的方法,谁看到了告诉我。
java treemap用法_java TreeMap用法相关推荐
- java treemap用法_Java TreeMap put()用法及代码示例
TreeMap的java.util.TreeMap.put()方法用于将映射插入Map.这意味着我们可以将特定的键及其映射到的值插入到特定的映射中.如果传递了现有键,则以前的值将被新值替换.如果传递了 ...
- java treemap 方法_Java TreeMap类
TreeMap类使用树实现Map接口.TreeMap类提供了一种以排序顺序存储键/值对的有效方法,并允许快速检索. 注意,与哈希映射不同,树映射保证其元素将按升序键顺序排序. 以下是TreeMap类支 ...
- java的scanner用法_Java Scanner用法详解
一.Scanner类简介 Java 5添加了java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序.它是以前的StringTokenizer和Matcher类之间的某种结合.由于 ...
- java super实例_java Super 用法详解及实例代码
java Super 用法详解及实例代码 发布于 2021-1-8| 复制链接 摘记: java Super 用法详解 1)有人写了个很好的初始化属性的构造函数,而你仅仅想要在其中添加另一些自己新建 ...
- java用法_Java 习惯用法总结
Java 习惯用法总结 2015/04/07 | 分类: 基础技术 | 4 条评论 | 标签: idiom,Java 分享到:97 本文由 ImportNew - 进林 翻译自nayuki.欢迎加入翻 ...
- java 注解使用_Java 注解用法
Java 注解用法 1.简述 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata) 与程序元素(类.方 ...
- java list用法_Java List 用法详解及实例分析
Java List 用法详解及实例分析 Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java List用法做了详解. List:元素是有序的(怎么存的就怎么取出来,顺 ...
- java assert函数_Java Assert 用法简介
在JDK1.4中增加了Assert的新功能,用于开始.调试时期的错误检测,它可以通过-ea 的JVM参数关闭,关闭以后对程序的性能没有任何影响. 最好的教程 请见:http://java.sun.co ...
- java switch 变量_Java switch 用法实例
首页 > 基础教程 > 循环条件语句 > 条件语句switch Java switch 用法实例 switch允比对一个变量的值,来执行不同情况的代码.switch使用规则如下: 1 ...
最新文章
- Asp.net(C#)给图片加上水印效果(转自园上的Seven Eleven)
- C# 3.0 —— 扩展方法
- 【组队学习】【29期】7. 集成学习(上)
- hdu5184 给出(和)前半段问后面有多少种加括号方法使合法:类似卡特兰数+逆元模板...
- 深度学习100例 | 第29天-ResNet50模型:船型识别
- CentOS 6.5编译安装Nginx+MySQL+PHP
- 牛客题霸 最少素数拆分 C++题解/答案
- 29使用QRcode方式生成二维码
- 以容器为代表的云原生技术,正成为释放云价值最短路径
- 华为暂没有推出鸿蒙手机计划;苹果否认 iPhone 辐射超标;Kotlin 1.3.50 发布 | 极客头条...
- 【JS教程】100+常用JS函数(方法)
- php正则表达式 什么,php正则表达式是什么?(代码实例)
- 精读《图解HTTP》
- 单证票据识别之关键信息提取
- 【高级检索】现在还有人不会用百度的搜索语法?
- 价格操控:大数据“杀熟”和算法合谋
- 教你轻松获取windows10锁屏壁纸
- 微型计算机软件系统分为什么,微型计算机软件微型计算机软件主要包括哪些软件?...
- 织梦域名后缀.html,织梦cms建站教程之首页域名后缀index.html去除的方法
- 教程:Nodejs大漠插件开发游戏脚本实战
热门文章
- ERA5数据不同下载方法
- 千万不要在朋友圈发“原图”,不然你的信息分分钟泄露(一)
- 学习编程语言必须掌握哪些计算机基础知识?
- [Java] Application provided invalid, non monotonically increasing dts to muxer in stream 0
- 如何在Ubuntu 18.04上安装Let‘s Encrypt SSL证书
- Go互斥锁(Mutex)
- 目标检测:Anchor【就是在图像上预设好的不同大小,不同长宽比的参照框】
- 新手入门,webpack入门详细教程
- 语音信号处理之(四)梅尔频率倒谱系数(MFCC)
- 斐波那契数列C语言实现