下面的树图怎么样:
Map<String, String> sortedMap = new TreeMap<>(Comparator.comparingInt(String::length)
.thenComparing(Function.identity()));
无论你在这个 sortedMap 中放入什么,它都会自动排序。首先是接口TreeMap
的排序实现。Map
有一个但是因为它在 [自然顺序时尚] [https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html] 上对键进行排序。正如 Java 文档所说,String
类型是字典自然顺序类型。想象一下下面的字符串类型的数字列表。意味着下面的列表将按预期排序。
List<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”之后。这是字典数据类型(如字符串)的本质。如果那个是整数数据类型,那也没关系。
要修复此使用参数,首先检查字符串的长度,然后比较它们。在 java 8 中是这样完成的:
Map<String, String> sortedMap = new TreeMap<>(Comparator.comparingInt(String::length)
.thenComparing(Function.identity()));
它首先按长度比较每个元素,然后应用 check bycompareTo
作为与要比较的元素相同的输入。
如果您更喜欢使用更易于理解的方法,上面的代码将等同于下面的代码:
Map<String, String> sortedMap = new TreeMap<>(
new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int lengthDifference = o1.length() - o2.length();
if (lengthDifference != 0) return lengthDifference;
return o1.compareTo(o2);
}
}
);
因为TreeMap
构造函数接受比较器接口,所以您可以构建任何更复杂的复合类实现。
这也是另一种形式更加简化的版本。
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);
}
);