按键升序排列地图

时间:2019-01-23 17:20:15

标签: java sorting hashmap map-function

我正在尝试根据键对地图进行升序排序。鉴于Map

Map<Integer, String> map = new LinkedHashMap<Integer, String>();

map.put(5, "five");
map.put(1, "one");
map.put(3, "three");
map.put(0, "zero");

我要订单:

0, zero
1, one
3, three
5, five

我编写了以下代码来实现此目的:

    public <K, V extends Comparable<? super V>> Map<K, V> sortByKeyInAscendingOrder(Map<K, V> map)
{
    List<Entry<K, V>> list = new ArrayList<>(map.entrySet());
    list.sort(Entry.comparingByKey());

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

但是,当我致电sort()时,出现以下错误:

The method sort(Comparator<? super Map.Entry<K,V>>) in the type List<Map.Entry<K,V>> is not applicable for the arguments (Comparator<Map.Entry<Comparable<? super Comparable<? super K>>,Object>>)

我编写了类似的代码(效果很好)以按值排序(将Entry.comparingByKey()更改为Entry.comparingByValue()),但是由于某些原因,当我尝试按键排序时,出现了以上错误。

我该如何解决?

谢谢

4 个答案:

答案 0 :(得分:2)

method comparingByKey要求其键K类型的参数为Comparable,而不是(不一定)其值V

将绑定的? extends Comparable<? super K>V移动到K。更改

<K, V extends Comparable<? super K>>

<K extends Comparable<? super K>, V>

当然也可以将V也设为Comparable,但使该绑定指向自身,而不是指向K

V extends Comparable<? super V>

答案 1 :(得分:2)

您需要使K具有可比性,以使其排序;并且V上的边界是错误的(但还是不必要的)。

public <K extends Comparable<? super K>, V> Map<K, V> sortByKeyInAscendingOrder(Map<K, V> map)

请介意,更简单的方法可能是:

return new LinkedHashMap<>(new TreeMap<>(map));

return map.entrySet().stream()
    .sorted(Entry.comparingKey())
    .collect(toMap(k -> k, v -> v, LinkedHashMap::new));

答案 2 :(得分:2)

如何使用TreeMap?保持键以自然顺序排序:

https://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html

如果需要从现有地图创建它,请使用它的参数化构造函数:

TreeMap<Integer,String> treeMap = new TreeMap<>(map);

因为使用HashMap不能保证顺序,而LinkedHashMap则保持插入顺序。要使地图按键排序,请使用TreeMap。

答案 3 :(得分:2)

您也可以尝试使用Java 8流

Map<Integer, String> map = new LinkedHashMap<Integer, String>();

    map.put(5, "five");
    map.put(1, "one");
    map.put(3, "three");
    map.put(0, "zero");

    map = map.entrySet().stream().sorted(Comparator.comparing(Map.Entry::getKey))
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

    System.out.println(map);  //{0=zero, 1=one, 3=three, 5=five}

或者您可以在forEach上使用Map

map.forEach((k,v)->System.out.println(k+"  "+v));