Как отсортировать карту «Ключ, значение» по значениям в Java с помощью функции упорядочивания коллекций Google

Как отсортировать карту (?, B) по значениям в Java с помощью функции упорядочения коллекций Google, если B - это класс, который имеет поле типа double, которое следует использовать для упорядочения.


person user326667    schedule 22.05.2010    source источник
comment
вы хотите отсортировать значения или карту, то есть хотите ли вы, чтобы будущие вызовы, скажем, keySet() возвращались в отсортированном порядке, или вы просто хотите временно отсортировать значения?   -  person Carl    schedule 23.05.2010


Ответы (2)


Вот фрагмент, который использует универсальный метод, который принимает Map<K,V> и Comparator<? super V> и возвращает SortedSet из своих entrySet(), отсортированных по значениям с использованием компаратора.

public class MapSort {
    static <K,V> SortedSet<Map.Entry<K,V>>
    entriesSortedByValues(Map<K,V> map, final Comparator<? super V> comp) {
        SortedSet<Map.Entry<K,V>> sortedEntries = new TreeSet<Map.Entry<K,V>>(
            new Comparator<Map.Entry<K,V>>() {
                @Override public int compare(Entry<K, V> e1, Entry<K, V> e2) {
                    return comp.compare(e1.getValue(), e2.getValue());
                }
                
            }
        );
        sortedEntries.addAll(map.entrySet());
        return sortedEntries;
    }
    static class Custom {
        final double d;   Custom(double d) { this.d = d; }
        @Override public String toString() { return String.valueOf(d); }
    }
    public static void main(String[] args) {
        Map<String,Custom> map = new HashMap<String,Custom>();
        map.put("A", new Custom(1));
        map.put("B", new Custom(4));
        map.put("C", new Custom(2));
        map.put("D", new Custom(3));
        System.out.println(
            entriesSortedByValues(map, new Comparator<Custom>() {
                @Override public int compare(Custom c1, Custom c2) {
                    return Double.compare(c1.d, c2.d);
                }           
            })
        ); // prints "[A=1.0, C=2.0, D=3.0, B=4.0]"
    }
}

В Google Заказе

public static <T> Ordering<T> from(Comparator<T> comparator)

Возвращает порядок для ранее существовавшего компаратора.

В приведенном выше решении используется Comparator, поэтому вы можете легко использовать описанный выше метод для использования вместо него Ordering.

person polygenelubricants    schedule 22.05.2010
comment
класс упорядочения возвращает список, как создать ImmutableSortedMap из этого списка? - person user326667; 23.05.2010
comment
@chris-gr: у вас не может быть SortedMap<K,V>, который сортируется по V. Это нарушает SortedMap контракт. См. stackoverflow.com/questions/2864840/treemap-sort-by- значение Лучшее, что вы можете сделать, это создать ImmutableSortedSet из SortedSet<Map.Entry<K,V>> - person polygenelubricants; 23.05.2010

Collections.sort(map.values(), myComparator); Создайте myComparator как Comparator для сравнения объектов B по двойному полю.

person duduamar    schedule 22.05.2010
comment
-1 Collections.sort(..) требует список, а map.values() возвращает коллекцию. Это не скомпилируется. - person whiskeysierra; 23.05.2010