Java Map Value Comparator, сортировка при вставке

Я хотел бы вставить элементы в HashMap, TreeMap или SortedMap (вы можете предложить некоторые другие api), используя значение Comparator.

Я прочитал много сообщений, включая этот один, большинство сообщений предлагают повторно вставить HashMap в SortedMap со значением Comparator после того, как все элементы были вставлены.

Мне не интересно снова вставлять все значения. Разве нет опции или аналогичной структуры карты, которая поддерживает активацию значения Компаратор после каждой вставки?

Если есть дублирующаяся проблема, я бы по достоинству оценил ссылку (я сделал некоторый поиск, хотя, возможно, я пропустил некоторые)

Опять же, я заинтересован в добавлении значения в какую-то упорядоченную карту, так что все элементы будут упорядочены по значению, а не по ключу, после каждой отдельной вставки.

Значение в записи карты на самом деле является сложным объектом с некоторыми геттерами, и я хочу сортировать только конкретным получателем объекта value.

Ответ 1

У меня есть некоторое обходное решение, оно не идеально и будет использовать еще немного памяти, но это довольно просто.

Я могу расширить ключ карты, чтобы также сохранить значение, возвращаемое получателем объекта Value. Затем я буду расширять комбинатор ключей для сортировки по правильному кортежу ключа.

UPDATE

Работал как шарм с очень хорошей производительностью.

Ответ 2

Я думаю, что вам нужно org.apache.commons.collections.bidimap.TreeBidiMap

Ред-Черная реализация BidiMap на основе дерева, где все добавленные объекты реализуют интерфейс Comparable.

Этот класс гарантирует, что карта будет как в порядке возрастания, так и в порядке возрастания, отсортированном в соответствии с естественным порядком для классов ключей и значений.

Ответ 3

Карты - это переход от ключа к значению. Guava имеет концепцию двунаправленных сопоставлений, но вы не заботитесь о переходе от значения к ключу, а скорее подвергаете сортировке итерации значений. Я рекомендую использовать специальный контейнер, в котором будут размещены как HashMap, так и Priority Queue.

Итак, расширьте интерфейсы Map, Collection и Iterable и добавьте вставку как в HashMap, так и в Priority Queue. Когда вы итерации, итерации по очереди, когда вы ищете/получить идти на карту.

Ответ 4

Я искал что-то похожее и не мог использовать TreeBidiMap, потому что он требует, чтобы Ключи Карты реализовали интерфейс Comparable.

Итак, я написал свой минималистический ValueTreeMap:

import java.util.HashMap;
import java.util.Iterator;
import java.util.TreeSet;

public class ValueTreeMap<K, V extends Comparable<V>> implements Iterable<V> {
    private TreeSet<V> tree = new TreeSet<V>();
    private HashMap<K, V> map = new HashMap<K, V>();

    public void put(K key, V value){
        V oldValue = map.get(key);
        if(oldValue != null){
            tree.remove(oldValue);
        }
        tree.add(value);
        map.put(key, value);
    }

    public V get(K key){
        return map.get(key);
    }

    @Override
    public Iterator<V> iterator() {
        return tree.iterator();
    }

}