Коллекция Java, которая возвращает инвертирование значения - PullRequest
0 голосов
/ 30 апреля 2019

Есть ли коллекция, которая работает следующим образом:

// когда

value1 -> value2 
value3 -> value4

// чтобы

value2 is the opposite of value1
and
value4 is the opposite of value3

// затем запросыдолжно работать следующим образом:

request in:value1 return out:value2
request in:value2 return out:value1

и т. д.

Я думаю, я могу сделать это с помощью функций, но мне интересно, есть ли для этого специализированная коллекция.

1 Ответ

2 голосов
/ 30 апреля 2019

Вы, похоже, ищете обратимое отображение.Это уже обсуждалось довольно подробно: Карта инвертирования Java .

Одна из ссылок из этого предыдущего обсуждения относится к решению Apache: https://commons.apache.org/proper/commons-collections/javadocs/api-3.2.2/org/apache/commons/collections/BidiMap.html.

Хотя Javaне имеет типа коллекции, который обрабатывает это эффективно, вы можете создать его самостоятельно, составив две карты:

public class BiDiMap<T1, T2> {
    private final Map<T1, T2> forwardMap = new HashMap<T1, T2>();
    private final Map<T2, T1> reverseMap = new HashMap<T2, T1>();

    public void put(T1 t1, T2 t2) {
        T2 oldT2 = forwardMap.put(t1, t2);
        T1 oldT1 = reverseMap.put(t2, t1);
    }
    public void remove(T1 t1, T2 t2) {
        T2 currentT2 = forwardMap.get(t1);
        if ( currentT2 != t2 ) {
            // This is an error.
        }
        T1 currentT1 = reverseMap.get(t2);
        if ( currentT1 != t1 ) {
            // Also an error.
        }
        forwardMap.remove(t1);
        reverseMap.remove(t2);
    }
    public T2 getForward(T1 t1) {
        return forwardMap.get(t1);
    }
    public T1 getReverse(T2 t2) {
        return reverseMap.get(t2);
    }
}

и т. д.

Это предполагает, что отображение одно-к одному.Реализация отличается, если сопоставление один-ко-многим, многие-к-одному или многие-ко-многим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...