最近工作遇到需要按一个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用法相关推荐

  1. java treemap用法_Java TreeMap put()用法及代码示例

    TreeMap的java.util.TreeMap.put()方法用于将映射插入Map.这意味着我们可以将特定的键及其映射到的值插入到特定的映射中.如果传递了现有键,则以前的值将被新值替换.如果传递了 ...

  2. java treemap 方法_Java TreeMap类

    TreeMap类使用树实现Map接口.TreeMap类提供了一种以排序顺序存储键/值对的有效方法,并允许快速检索. 注意,与哈希映射不同,树映射保证其元素将按升序键顺序排序. 以下是TreeMap类支 ...

  3. java的scanner用法_Java Scanner用法详解

    一.Scanner类简介 Java 5添加了java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序.它是以前的StringTokenizer和Matcher类之间的某种结合.由于 ...

  4. java super实例_java Super 用法详解及实例代码

    java Super 用法详解及实例代码 发布于 2021-1-8| 复制链接 摘记: java  Super 用法详解 1)有人写了个很好的初始化属性的构造函数,而你仅仅想要在其中添加另一些自己新建 ...

  5. java用法_Java 习惯用法总结

    Java 习惯用法总结 2015/04/07 | 分类: 基础技术 | 4 条评论 | 标签: idiom,Java 分享到:97 本文由 ImportNew - 进林 翻译自nayuki.欢迎加入翻 ...

  6. java 注解使用_Java 注解用法

    Java 注解用法 1.简述 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata) 与程序元素(类.方 ...

  7. java list用法_Java List 用法详解及实例分析

    Java List 用法详解及实例分析 Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java List用法做了详解. List:元素是有序的(怎么存的就怎么取出来,顺 ...

  8. java assert函数_Java Assert 用法简介

    在JDK1.4中增加了Assert的新功能,用于开始.调试时期的错误检测,它可以通过-ea 的JVM参数关闭,关闭以后对程序的性能没有任何影响. 最好的教程 请见:http://java.sun.co ...

  9. java switch 变量_Java switch 用法实例

    首页 > 基础教程 > 循环条件语句 > 条件语句switch Java switch 用法实例 switch允比对一个变量的值,来执行不同情况的代码.switch使用规则如下: 1 ...

最新文章

  1. Asp.net(C#)给图片加上水印效果(转自园上的Seven Eleven)
  2. C# 3.0 —— 扩展方法
  3. 【组队学习】【29期】7. 集成学习(上)
  4. hdu5184 给出(和)前半段问后面有多少种加括号方法使合法:类似卡特兰数+逆元模板...
  5. 深度学习100例 | 第29天-ResNet50模型:船型识别
  6. CentOS 6.5编译安装Nginx+MySQL+PHP
  7. 牛客题霸 最少素数拆分 C++题解/答案
  8. 29使用QRcode方式生成二维码
  9. 以容器为代表的云原生技术,正成为释放云价值最短路径
  10. 华为暂没有推出鸿蒙手机计划;苹果否认 iPhone 辐射超标;Kotlin 1.3.50 发布 | 极客头条...
  11. 【JS教程】100+常用JS函数(方法)
  12. php正则表达式 什么,php正则表达式是什么?(代码实例)
  13. 精读《图解HTTP》
  14. 单证票据识别之关键信息提取
  15. 【高级检索】现在还有人不会用百度的搜索语法?
  16. 价格操控:大数据“杀熟”和算法合谋
  17. 教你轻松获取windows10锁屏壁纸
  18. 微型计算机软件系统分为什么,微型计算机软件微型计算机软件主要包括哪些软件?...
  19. 织梦域名后缀.html,织梦cms建站教程之首页域名后缀index.html去除的方法
  20. 教程:Nodejs大漠插件开发游戏脚本实战

热门文章

  1. ERA5数据不同下载方法
  2. 千万不要在朋友圈发“原图”,不然你的信息分分钟泄露(一)
  3. 学习编程语言必须掌握哪些计算机基础知识?
  4. [Java] Application provided invalid, non monotonically increasing dts to muxer in stream 0
  5. 如何在Ubuntu 18.04上安装Let‘s Encrypt SSL证书
  6. Go互斥锁(Mutex)
  7. 目标检测:Anchor【就是在图像上预设好的不同大小,不同长宽比的参照框】
  8. 新手入门,webpack入门详细教程
  9. 语音信号处理之(四)梅尔频率倒谱系数(MFCC)
  10. 斐波那契数列C语言实现