如何根据条目列表的值和键对地图进行排序
首先按Value desc排序,然后如果值冲突按Key Desc排序
给定地图中的示例:
Map<String,Integer> data = new HashMap();
data.put("a",10);
data.put("b",3);
data.put("c",10);
预期订单:
["c", 10], ["a",10], ["b",3]
你要找的是所谓的“稳定”排序算法。这意味着,在排序时,相同的对象会保持原来的顺序
示例:
{ ['a', 5], ['b', 5], ['a', 10] } -> { ['a', 5], ['a', 10], ['b', 5] }
示例不稳定:
{ ['a', 5], ['b', 5], ['a', 10] } -> { ['a', 10], ['a', 5], ['b', 5] }
需要注意的一点是,首先需要按键排序,然后按值排序,以获得所需的实际排序。
使用流api和自定义比较器。
static int comparer(Map.Entry<String, Integer> e1, Map.Entry<String, Integer> e2) {
//* 1000 here just to make sure value has higher priority
// maybe *3 is already enough?
// just want to avoid if else here
return e2.getValue().compareTo(e1.getValue()) * 1000
+ e2.getKey().compareTo(e1.getKey());
}
public static void main(String args[]){
Map<String, Integer> data = new HashMap();
data.put("a", 10);
data.put("b", 3);
data.put("c", 10);
data.entrySet().stream()
.sorted((o1, o2) -> comparer(o1, o2))
.forEach((kv -> System.out.println(
String.format("%s\t%s", kv.getKey(), kv.getValue()))));
// c 10
// a 10
// b 3
}
}
写一个比较器
问题内容: Stream >> sorted = index.entrySet().stream() .sorted(Map.Entry.comparingByValue()); 类型中的方法不适用于参数 我想根据作为的值的列表对a进行排序。如何使用Java 8中的Stream库实现此目的? 问题答案: 这可能对您有帮助。 我将结果映射的类型更改为 LinkedHashMap 以遵守插入顺序。
有了上面的地图值列表,我需要在一个伸展过程中根据date1和date2进行排序,从而得到下面的输出… 对于上述输入数据,我要求的O/P顺序是:
假设我们有一个叫做活动的班级: 因此,每个活动对象都将有一个项目。。而且每个项目都有一个单元。两个不同的项目可以具有相同的单元: 一个单位也有一个名字: 所以目前我有一个树状图像这样: 一个例子可能是: 等 现在让我们假设projectOne与projectThree具有相同的单元(unitAAA),projectThree具有UNITZZ。。。 我想按项目元素的单位按字母顺序对地图进行排序: 我
问题内容: 我有一个这样的: 我想根据列表值的大小按升序对地图进行排序。我怎样才能做到这一点? 在这种情况下,我希望订购加拿大,印度,美国的钥匙。 问题答案: 没有可保证的迭代顺序,因此您需要收集到一个才能使排序有意义。 之所以引发,是因为合并器功能仅用于并行流],而我们并未使用。 如果您觉得可读性更好,也可以使用:
问题内容: 如何使用树的值而不是键对树图进行排序? 问题答案: 您不能这样做,因为TreeMap的比较器仅针对键运行,例如,参见this 构造函数。 无论如何,您可以使用多个Collections,使用TreeMap(或HashMap)通过键查找元素,并具有SortedSet来迭代值。