treemap倒叙_TreeMap 排序

treemap倒叙_TreeMap 排序一 TreeMapTreeM 默认排序规则 按照 key 的字典顺序来排序 升序 当然 也可以自定义排序规则 要实现 Comparator 接口 用法简单 先看下下面的 demopubliccl publicstatic String args System out println 默认排序结果

一、TreeMap

TreeMap 默认排序规则:按照key的字典顺序来排序(升序)

当然,也可以自定义排序规则:要实现Comparator接口。

用法简单,先看下下面的demo

public classSortDemo {public static voidmain(String[] args) {

System.out.println(“—————- 默认 排序结果—————–“);

createDefaultSortTreeMap();

System.out.println(“—————- 自定义 排序结果—————–“);

createDefinitionSortTreeMap();

}public static voidcreateDefaultSortTreeMap() {

TreeMap map = new TreeMap();

init(map);

print(map);

}public static voidcreateDefinitionSortTreeMap() {

TreeMap map = new TreeMap(new Comparator() {

@Overridepublic intcompare(String o1, String o2) {returno2.compareTo(o1);

}

});

init(map);

print(map);

}public static void init(Mapmap) {

map.put(“c”, “1”);

map.put(“a”, “1”);

map.put(“bb”, “1”);

map.put(“b”, “1”);

}public static void print(Mapmap) {

Iterator> it =map.entrySet().iterator();while(it.hasNext()) {

Entry entry =it.next();

System.out.println(entry.getKey()+ ” : ” +entry.getValue());

}

}

结果:—————- 默认 排序结果—————–a :1b :1bb :1c :1

—————- 自定义 排序结果—————–c :1bb :1b :1a :1

二、扩展:字典顺序

1、排序规则

两个字符串 s1, s2比较

(1)、如果s1和s2是父子串关系,则 子串 < 父串

(2)、如果非为父子串关系, 则从第一个非相同字符来比较。

例子 s1 = “ab”, s2 = “ac”    这种情况算法规则是从第二个字符开始比较,由于’b’ < 'c' 所以  "ab" < "ac"

(3)、字符间的比较,是按照字符的字节码(ascii)来比较

2、  compareTo 实现机制:对于字符串来说,字典排序规则;对于数字来说,直接按照大小排序

下面, 是我在项目中,遇到的一个坑,也不能算坑吧,只能说基础掌握得不扎实,导致老不断犯错。先说下场景,有个需求要对Map排序,当时想当然就用了自定义的TreeMap(new

Comparator )

key 为 String, value 也会String类型, 然后很不幸的是,我的Key 是 数字 字符串 ,如 Map.put(“2″,”1”),Map.put(“12″,”1”),Map.put(“13″,”1”)

正常思维排序结果是 “2” < "12" < "13" ,仔细一想,compareTo 底层算法是 "字典排序",正确的排序结果 : "12" < "13"

但是我的需求又是想要”2″ < "12" < "13"这种效果,如何实现呢?很简单,把Key改为Long类型,这样,就会按照大小来排序。

看下下面的例子,可能比较简单明了!

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 public classSortDemo2 {2

3 private final static int SIZE = 30;4

5 public static voidmain(String[] args) {6 System.out.println(“—————- key 为 Sting 排序结果—————–“);7 String s = newString();8 createTreeMap(s);9 System.out.println(“—————- key 为 Long 排序结果—————–“);10 Long l = new Long(0);11 createTreeMap(l);12 }13

14 public static voidcreateTreeMap(Object obj) {15

16 TreeMap map = new TreeMap<>(new Comparator() {17

18 @Override19 public intcompare(Object o1, Object o2) {20 if(o1 instanceof String && o2 instanceofString) {21 return((String) o1).compareTo((String) o2);22 } else if(o1 instanceof Long && o2 instanceofLong) {23 return((Long) o1).compareTo((Long) o2);24 }25 return 0;26 }27

28 });29

30 for(int i = 1; i

39 print(map);40 }41

42 public static void print(Mapmap) {43 Iterator> it =map.entrySet().iterator();44 while(it.hasNext()) {45 Entry entry =it.next();46 System.out.println(entry.getKey() + ” : ” +entry.getValue());47 }48 }49 }50

51 结果:52

53 —————- key 为 Sting 排序结果—————–

54 1 : 1

55 10 : 10

56 11 : 11

57 12 : 12

58 13 : 13

59 14 : 14

60 15 : 15

61 16 : 16

62 17 : 17

63 18 : 18

64 19 : 19

65 2 : 2

66 20 : 20

67 21 : 21

68 22 : 22

69 23 : 23

70 24 : 24

71 25 : 25

72 26 : 26

73 27 : 27

74 28 : 28

75 29 : 29

76 3 : 3

77 4 : 4

78 5 : 5

79 6 : 6

80 7 : 7

81 8 : 8

82 9 : 9

83 —————- key 为 Long 排序结果—————–

84 1 : 1

85 2 : 2

86 3 : 3

87 4 : 4

88 5 : 5

89 6 : 6

90 7 : 7

91 8 : 8

92 9 : 9

93 10 : 10

94 11 : 11

95 12 : 12

96 13 : 13

97 14 : 14

98 15 : 15

99 16 : 16

100 17 : 17

101 18 : 18

102 19 : 19

103 20 : 20

104 21 : 21

105 22 : 22

106 23 : 23

107 24 : 24

108 25 : 25

109 26 : 26

110 27 : 27

111 28 : 28

112 29 : 29

View Code

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/225266.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午9:42
下一篇 2026年3月17日 上午9:42


相关推荐

  • pytest运行_pytest执行多个py文件

    pytest运行_pytest执行多个py文件前言pytest运行完用例之后会生成一个.pytest_cache的缓存文件夹,用于记录用例的ids和上一次失败的用例。方便我们在运行用例的时候加上–lf和–ff参数,快速运行上一

    2022年7月31日
    12
  • 继电器的驱动电路

    继电器的驱动电路文章目录前言一、DC5V,DC12V,DC~V是什么?二、使用步骤1.小测试三极管如何驱动继电器总结前言很多同学不知道继电器如何使用,这里简单的介绍一下,我这里介绍一下5脚的继电器一、DC5V,DC12V,DC~V是什么?这里的5V,12V指的是继电器的工作电压,也就是1脚和3脚两端的电压,具体看电压器的规格,如果你是DC5V,那你1脚和3脚之间的电压必须是5V,2脚是输入,5脚是常闭端,也就是平时2脚跟5脚连接在一起,当13脚电流达到50mA之后,触点就打到了4脚,也就是说2脚跟4脚连在了一起。

    2022年6月24日
    26
  • c语言 数组存放规则,C语言数组详解

    c语言 数组存放规则,C语言数组详解数组在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。本章介绍数值数组和字符数组,其余的在以后各章陆续介绍。数组类型说明在C语言中使…

    2022年7月27日
    5
  • MyEclipse 快捷键

    MyEclipse快捷键1(CTRL)Ctrl+1快速修复Ctrl+D:删除当前行 Ctrl+Q定位到最后编辑的地方 Ctrl+L定位在某行Ctrl+O快速显示O

    2021年12月25日
    52
  • Go reflect初探

    Go reflect初探在计算机科学中 反射是指计算机程序在运行时 Runtime 可以访问 检测和修改它本身状态或行为的一种能力 用比喻来说 那种程序能够 观察 并且修改自己的行为 要注意反射和内省 typeintrospe 的区别 对应于变量 也就是围绕着它的类型 type 和值 value 进行展开 Go 的空接口概念 反射可以发挥很大的威力 两个重要类型 reflect Type re

    2025年10月2日
    5
  • eBay是如何进行大数据集元数据发现的

    eBay是如何进行大数据集元数据发现的

    2021年6月29日
    72

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号