按键升序排序地图
Sort Map in Ascending Order by Key
我正在尝试根据键按升序对地图进行排序。鉴于 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()
)但是由于某种原因,当我尝试按键排序时出现上述错误。
我该如何解决这个问题?
谢谢
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>
您需要使 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));
使用 TreeMap 怎么样?它使键按自然顺序排序:
https://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html
如果您需要从现有地图创建它,请使用它的参数化构造函数:
TreeMap<Integer,String> treeMap = new TreeMap<>(map);
因为使用 HashMap 不能保证顺序,而 LinkedHashMap 维护插入顺序。要保持地图按键排序,请使用 TreeMap。
您也可以尝试使用 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}
或者您可以在 Map
上使用 forEach
map.forEach((k,v)->System.out.println(k+" "+v));
我正在尝试根据键按升序对地图进行排序。鉴于 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()
)但是由于某种原因,当我尝试按键排序时出现上述错误。
我该如何解决这个问题?
谢谢
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>
您需要使 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));
使用 TreeMap 怎么样?它使键按自然顺序排序:
https://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html
如果您需要从现有地图创建它,请使用它的参数化构造函数:
TreeMap<Integer,String> treeMap = new TreeMap<>(map);
因为使用 HashMap 不能保证顺序,而 LinkedHashMap 维护插入顺序。要保持地图按键排序,请使用 TreeMap。
您也可以尝试使用 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}
或者您可以在 Map
forEach
map.forEach((k,v)->System.out.println(k+" "+v));