gpt4 book ai didi

java - 如何按两个因素对 Map 进行排序?

转载 作者:行者123 更新时间:2023-11-30 06:13:43 27 4
gpt4 key购买 nike

我有一张 map ,我想按两个因素进行排序:

1) the int value of each element; and then
2) the length of key of each element.

这个通用函数可以按值排序,如何使其同时按 1) 和 2) 排序?

public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> unsortMap) {

List<Map.Entry<K, V>> list = new LinkedList<>(unsortMap.entrySet());

Collections.sort(list, new Comparator<Map.Entry<K, V>>() {
public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) {
return (o2.getValue()).compareTo(o1.getValue());
}
});

Map<K, V> result = new LinkedHashMap<>();
for (Map.Entry<K, V> entry : list) {
result.put(entry.getKey(), entry.getValue());
}
return result;
}

编辑:这个版本不能正常工作。有什么问题吗?

public static Map<String, Integer> sortByValueWithGenerics(Map<String, Integer> unsortMap) {

List<Map.Entry<String, Integer>> list =
new LinkedList<Map.Entry<String, Integer>>(unsortMap.entrySet());

Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
public int compare(Map.Entry<String, Integer> o1,
Map.Entry<String, Integer> o2) {
int c = (o1.getValue()).compareTo(o2.getValue());


if (c < 0) {
if(o2.getKey().length() >o1.getKey().length()){
c=-1;
}
}

return c;
}
});

Map<String, Integer> sortedMap = new LinkedHashMap<String, Integer>();
for (Map.Entry<String, Integer> entry : list) {
sortedMap.put(entry.getKey(), entry.getValue());
}

return sortedMap;
}

最佳答案

您的 if 条件应检查先前的比较是否返回 0,然后执行以下比较,如下所示:

if (c == 0) 
return Integer.compare(o1.getKey().length(), o2.getKey().length());

另外,请注意,我已将 o1.getKey().length() 作为第一个参数传递给 Integer.compare 方法,而不是传递它作为你所做的第二个参数。

现在,您的比较器读取为“按值排序,如果两个给定值相等,则按键升序的长度排序”。

<小时/>

从 java-8 开始,您可以进一步简化排序逻辑:

list.sort(Map.Entry.<String, Integer>comparingByValue()
.thenComparingInt(e -> e.getKey().length());

或者如果你想变得更奇特,那么整个方法可以变成:

public static Map<String, Integer> sortByValueThenByKey(Map<String, Integer> unsortMap) {
return unsortMap.entrySet()
.stream()
.sorted(Map.Entry.<String, Integer>comparingByValue()
.thenComparingInt(e -> e.getKey().length()))
.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue,(oldValue, newValue) -> newValue,
LinkedHashMap::new));
}

关于java - 如何按两个因素对 Map 进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49682154/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com