当前位置: 首页 > 知识库问答 >
问题:

如何根据条目列表的值和键对地图进行排序

金高飞
2023-03-14

如何根据条目列表的值和键对地图进行排序

首先按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]

共有3个答案

康鹏云
2023-03-14

你要找的是所谓的“稳定”排序算法。这意味着,在排序时,相同的对象会保持原来的顺序
示例:

{ ['a', 5], ['b', 5], ['a', 10] } -> { ['a', 5], ['a', 10], ['b', 5] }

示例不稳定:

{ ['a', 5], ['b', 5], ['a', 10] } -> { ['a', 10], ['a', 5], ['b', 5] }

需要注意的一点是,首先需要按键排序,然后按值排序,以获得所需的实际排序。

宫铭
2023-03-14

使用流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
        }
    }
丰胤运
2023-03-14

写一个比较器

 类似资料:
  • 问题内容: 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来迭代值。