gpt4 book ai didi

java - 如何概括一种在 Java 中对 Map 条目进行排序的方法?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:35:43 26 4
gpt4 key购买 nike

在我的代码中,我有几张 map 。然后我有一个类似于下面的方法,它采用其中一个映射,按条目的值对条目进行排序,并返回顶部条目的列表,其数量由参数给出。

例子:

如果输入图是这样的

  • "a"= 5,
  • "b"= 4,
  • "c"= 8,
  • “d”= 0,

然后我在参数中调用带有 quantity = 2 的方法,我得到了 2 个最高 map 条目的列表,按降序排列

  • "c"= 8,
  • “a”= 5。

现在,我对每个 map 都有一个这样的方法,它们的区别仅在于:

  • <Type1, Type2>整个方法的声明,以及
  • (distances.entrySet()); 所有列表的人口。

我能否以某种方式将其概括为只有一个相似的方法,能够接收任何类型?

private static Map<String, Double>      distances = new TreeMap<>();
private static Map<String, Integer> titles = new TreeMap<>();
private static Map<Integer, Integer> hours = new TreeMap<>();
private static Map<Date, Integer> days = new TreeMap<>();

public static List<Entry<String, Double>> getTopDistances(int quantity) {
List<Map.Entry<String, Double>> all = new ArrayList<>(distances.entrySet());
List<Map.Entry<String, Double>> requested = new ArrayList<>();

Collections.sort(all, new Comparator<Map.Entry<String, Double>>() {
@Override
public int compare(Entry<String, Double> e1, Entry<String, Double> e2) {
return (e2.getValue().compareTo(e1.getValue()));
}

});

int i = 0;
while (all.iterator().hasNext() && ++i <= quantity) {
requested.add(all.get(i - 1));
}

return requested;
}

我当然可以继续将所有方法分开,但我觉得有更好的方法。研究了泛型、通配符、集合和接口(interface),我认为这是可行的方法,但我仍然需要插入。

最佳答案

使用 Java Streams,一行就可以生成您想要的从映射到最终列表的内容。下面我将它打包成一个更简洁的私有(private)方法,但如果你愿意,你可以内联它。

由于您的所有值都是Comparable:

private <K, V extends Comparable<V>> List<Map.Entry<K,V>> getTop(Map<K,V> map, int quantity) {
return map.entrySet().stream()
.sorted((a,b) -> b.getValue().compareTo(a.getValue()))
.limit(quantity)
.collect(Collectors.toList());
}

如果值类型不可比较,则需要将比较器作为附加参数传递:

private <K, V> List<Map.Entry<K,V>> getTop(Map<K,V> map, Comparator<V> cmp, int quantity) {
return map.entrySet().stream()
.sorted((a,b) -> cmp.compare(b,a))
.limit(quantity)
.collect(Collectors.toList());
}

关于java - 如何概括一种在 Java 中对 Map 条目进行排序的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43017156/

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