使用下面的树形图:
Map<String, String> sortedMap = new TreeMap<>(Comparator.comparingInt(String::length)
.thenComparing(Function.identity()));
无论您在sortedMap中放入什么,它都会自动排序。首先,TreeMap是Map接口的排序实现。
有一个“但是”,因为它按自然顺序排列钥匙。正如Java文档所述,String类型是一种字典自然顺序类型。想象一下下面String类型的数字列表。这意味着下面的列表将不会按预期排序。
<String> 工作表 notsortedList = List.of(“78”,“0”, “24”, “39”, “4”,“53”,“32”);
如果你只使用默认的TreeMap构造函数,如下图所示,并逐个推入每个元素:
Map<String, String> map = new TreeMap<>();
for (String s : notSortedList) {
map.put(s, s);
}
System.out.println(map);
输出为:{0= 0,14 = 14,24 = 24,32 = 32,39 = 39,4 = 4,48 = 48,53 = 53,54 = 54,78 =78}
如你所见,数字4就在“39”后面。这是字典数据类型(如String)的本质。如果这是一个整数数据类型,那么这是可以的。
要解决这个问题,请使用参数首先检查字符串的长度,然后比较它们。在Java 8中是这样做的:
Map<String, String> sortedMap = new TreeMap<>(Comparator.comparingInt(String::length)
.thenComparing(Function.identity()));
它首先比较每个元素的长度,然后应用check by compareTo作为与要比较的元素相同的输入。
如果你更喜欢使用一个更容易理解的方法,上面的代码将与下面的代码等效:
> sortedMap = new TreeMap<>(
新的比较器(){
@Override
(String o1, String o2) {
int lengthDifference = o1.length() - o2.length();
if (lengthDifference != 0)
返回lengthDifference;
返回o1.compareTo (o2);
}
}
);
因为TreeMap构造函数接受比较器接口,所以您可以构建任何更复杂的Composite类实现。
这也是简单版本的另一种形式。
Map<String,String> sortedMap = new TreeMap<>(
(Comparator<String>) (o1, o2) ->
{
int lengthDifference = o1.length() - o2.length();
if (lengthDifference != 0)
return lengthDifference;
return o1.compareTo(o2);
}
);