use*_*757 4 java linkedhashmap
如何使用该值对LinkedHashMap进行排序?
有没有办法将条目插入到LinkedHashMap中,以便根据它们的值按顺序插入它们?
Rad*_*def 13
如何使用该值对LinkedHashMap进行排序?
LinkedHashMap没有排序,它是有序的通过插入的顺序.
如果您的目标是重新排序地图,您可能会做类似的事情
static <K, V> void orderByValue(
LinkedHashMap<K, V> m, final Comparator<? super V> c) {
List<Map.Entry<K, V>> entries = new ArrayList<>(m.entrySet());
Collections.sort(entries, new Comparator<Map.Entry<K, V>>() {
@Override
public int compare(Map.Entry<K, V> lhs, Map.Entry<K, V> rhs) {
return c.compare(lhs.getValue(), rhs.getValue());
}
});
m.clear();
for(Map.Entry<K, V> e : entries) {
m.put(e.getKey(), e.getValue());
}
}
Run Code Online (Sandbox Code Playgroud)
我们将所有条目放在List中,对List进行排序,然后将条目以新顺序放回Map中.
这是针对那些倾向的Java 8翻译:
static <K, V> void orderByValue(
LinkedHashMap<K, V> m, Comparator<? super V> c) {
List<Map.Entry<K, V>> entries = new ArrayList<>(m.entrySet());
m.clear();
entries.stream()
.sorted(Comparator.comparing(Map.Entry::getValue, c))
.forEachOrdered(e -> m.put(e.getKey(), e.getValue()));
}
Run Code Online (Sandbox Code Playgroud)
(出于好奇,可以浓缩,但效率较低):
static <K, V> void orderByValue(
LinkedHashMap<K, V> m, Comparator<? super V> c) {
new ArrayList<>(m.keySet()).stream()
.sorted(Comparator.comparing(m::get, c))
.forEachOrdered(k -> m.put(k, m.remove(k)));
}
Run Code Online (Sandbox Code Playgroud)
有没有办法将条目插入到LinkedHashMap中,以便根据它们的值按顺序插入它们?
不,见上文.LinkedHashMap没有排序.
如果你的目标是保持地图排序,你需要使用TreeMap; 但这样做有问题.地图中的条目需要具有唯一值.看到这里和这里.
| 归档时间: |
|
| 查看次数: |
14848 次 |
| 最近记录: |