如何通过值迭代Map,如果值相同,则按键对它们进行排序?

时间:2017-06-24 18:45:59

标签: java

我在HashMap中有团队和他们的点。我能够按他们的值对它们进行排序。

Map<String, Integer> sortedMap = Points.entrySet().stream()
            .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
            .collect(Collectors.toMap(Entry::getKey, Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));

现在我想遍历sortedMap并按顺序打印键,如果有匹配的值,则对具有相同值的键进行排序,然后打印结果。

4 个答案:

答案 0 :(得分:6)

您可以使用thenComparing链接比较器:

Map<String, Integer> sortedMap = Points.entrySet().stream()
        .sorted(Collections
                .reverseOrder(
                        Map.Entry.<String, Integer>comparingByValue())
                .thenComparing(Map.Entry.comparingByKey()))
        .collect(Collectors.toMap(Entry::getKey, Entry::getValue,
                (e1, e2) -> e1, LinkedHashMap::new));

这会将您现有的单一比较更改为两级比较。当第一个比较器认为两个元素相等时,第二个元素用于确定顺序。

请注意,Java 8为比较器引入了reversed方法,它比Collections.reverseOrder略微冗长:

Map<String, Integer> sortedMap = in.entrySet().stream()
        .sorted(Map.Entry.<String, Integer>comparingByValue().reversed()
                .thenComparing(Map.Entry.comparingByKey()))
        .collect(Collectors.toMap(Entry::getKey, Entry::getValue,
                (e1, e2) -> e1, LinkedHashMap::new));

答案 1 :(得分:1)

    Collections.sort( list, new Comparator<Map.Entry<String, Integer>>()
        {
            public int compare( Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2 )
            {
int cmp=o1.getValue().compareTo( o2.getValue());
              if(cmp ==0)
                return (o1.getKey().compareTo( o2.getKey() );//Ascending order
               else{
                  return cmp;
            }
        } );

答案 2 :(得分:0)

让我们将其划分为不同的部分,一次处理一项任务:

任务编号一:迭代地图

根据Map API,您可以通过调用keySet()从地图中获取一组键。

for (String s : sortedMap.keySet()) {
    System.out.println(s + ": " + sortedMap.get(s));
}

这将打印出地图中的所有键值对。

任务编号二:检查匹配值并排序

我们将使用具有相同值的List个字符串。通过像这样重新排序我们的地图,我们可以使用列表的长度来确定该值是否由多个字符串共享。

Map<Integer, List<String>> reveresed = new LinkedHashMap<Integer, List<String>>();
for (String s : sortedMap.keySet()) {
    if (reversed.contains(sortedMap.get(s)) {
        reversed.get(sortedMap.get(s)).add(s);
    }
    else
    {
        List<String> values = new ArrayList<String>();
        values.add(s);
        reversed.put(sortedMap.get(s), values);
    }
}

使用它,查询是否有重复项,我们可以检查:

if (reversed.get(value) != null && reversed.get(value).size() >= 2) {
    // Value is repeated
}

答案 3 :(得分:0)

为了完整起见,这里有一种方法可以使用Java 8功能,但没有流:

List<Entry<String, Integer>> entries = new ArrayList<>(points.entrySet());
entries.sort(Entry.<String, Integer>comparingByValue().reversed()
    .thenComparing(Entry.comparingByKey()));
Map<String, Integer> sortedMap = new LinkedHashMap<>(points.size());
entries.forEach(e -> sortedMap.put(e.getKey(), e.getValue()));