按值排序LinkedHashMap

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; 但这样做有问题.地图中的条目需要具有唯一值.看到这里这里.