最近工作遇到需要按一个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里直接反向的方法,谁看到了告诉我。

转自:http://huchenqiang90.blog.163.com/blog/static/11250080020101025956498/

转载于:https://blog.51cto.com/stevenliu/837353

java TreeMap用法相关推荐

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

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

  2. java treemap用法_java TreeMap用法

    最近工作遇到需要按一个model中不同的列进行排序的问题,查了一下JDK API文档,发现,java中可以排序的工具类和接口共有五个SortedMap .SortedSet.TreeMap .Tree ...

  3. java treemap用法_JAVA作业,使用TreeMapK,V类

    展开全部 import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util. ...

  4. java treemap 排序原理,Java TreeMap排序算法实例

    本文实例讲述了Java TreeMap排序算法.分享给大家供大家参考,具体如下: TreeMap 和 HashMap 用法大致相同,但实际需求中,我们需要把一些数据进行排序: 以前在项目中,从数据库查 ...

  5. java resume过时方法_学点开发|关于Java多线程用法解析

    在进行学习之前,我们先来了解下,什么是Java多线程: 多线程是实现并发机制的一种有效手段.进程和线程一样,都是实现并发的一个基本单位.为了让大家更清晰读懂关于Java多线程用法,由以下几点入手学,帮 ...

  6. java中map的put方法,Java TreeMap put()方法

    Java TreeMap put()方法 java.util.TreeMap.put() 在Map中插入具有指定键的指定值. 1 语法 public V put(K key,V value) 2 参数 ...

  7. java正则表达式用法示例_Java正则表达式教程及示例

    java正则表达式用法示例 当我开始使用Java时,正则表达式对我来说是一场噩梦. 本教程旨在帮助您掌握Java正则表达式,并让我定期返回以刷新我的正则表达式学习. 什么是正则表达式? 正则表达式定义 ...

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

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

  9. java反射用法示例_Java包| 类型,用法,示例

    java反射用法示例 配套 (Packages) Packages in Java is simply a mechanism to encapsulate (i.e. to put in a sho ...

最新文章

  1. 初等数论--原根--怎么判断a是不是模m的原根
  2. sudo dpkg 找不到命令_【干货】Linux中实用但很小众的11个炫酷终端命令
  3. [Python] MySQLdb(即 MySQL-python 包)在 OS X 中安装指南
  4. MySQL实现当前数据表的所有时间都增加或减少指定的时间间隔
  5. spike 序列matlab,SPKtool1.0.1 神经信号spike 分类及处理 工具包 matlab 238万源代码下载- www.pudn.com...
  6. USACO sec2.1 Ordered Fractions
  7. 陶哲轩实分析命题6.4.12
  8. Leetcode每日一题:844.backspace-string-compare(比较含退格的字符串)
  9. python求最大值代码的方式_python使用分治法实现求解最大值的方法
  10. Windows Server 2008 活动目录备份的几种方法
  11. linux添加windows隐藏属性,解决文件夹隐藏属性无法取消的办法
  12. ios 版手机迅雷的安装方法
  13. Hadoop HA 搭建
  14. 计算机维修难点,计算机组装与维修习重难点.doc
  15. keyshot渲染玻璃打光_KeyShot渲染,打光这么打,效果倍儿棒!
  16. 大富豪5.3全网首发,真正的5.3正版破解授权,不是高防端
  17. CVPR2020交互式分割算法IOG的配置(Interactive Object Segmentation with Inside-Outside Guidance)
  18. 服务器重装系统进入pe找不到硬盘,U盘装系统进入PE无法找到硬盘怎么办?
  19. PCIe PCS sublayer
  20. spss分析方法-多个独立样本检验(转载)

热门文章

  1. 在Ubuntu上安装Odoo 11(企业版)
  2. Re:从零开始的机器学习 - Machine Learning(一) 线性回归
  3. Ubuntu下非常规方法安装绿色软件(压缩包)
  4. mysql5.7忘记root密码的修改方法
  5. VBS字符编码的说明
  6. FZU1669 Right-angled Triangle【毕达哥拉斯三元组】
  7. 你最常用的构建和发布管理工具是什么
  8. 在JavaScript中使用inline函数的问题
  9. 第9章 数据字典(选项)管理
  10. selenium+python自动化84-chrome手机wap模式