Составной ключ в HashMap с отношением пофиг для одного из значений - PullRequest
1 голос
/ 23 января 2020

Я хочу создать HashMap, который имеет несколько строк / Enum в качестве составного ключа. Я хочу изменить функциональность, так что если карта заполнена значением enum / string как «по умолчанию», то оно будет соответствовать чему-либо в поиске

Ключ здесь соответствует любому значению «default» , если указанное значение c не существует.

скажем, следующий класс является классом Key этого HashMap:

class KeyClass{
  String val1;
  String val2;
  String val3;
}

HashMap<KeyClass, String> randomMap = new HashMap<>;

randomMap.put(new KeyClass("abc", "default", "efg"), "value1");
randomMap.put(new KeyClass("abc", "def", "efg"), "value2");
randomMap.get(new KeyClass("abc", "wef", "efg")); // should return "value1" as "wef" should match to default, 
randomMap.get(new KeyClass("abc", "def", "efg")) // should return "value2", as it explicitly matches

В частности, я хотел бы предложить варианты дизайна для такой структуры Map (для instace она будет работать с двумя разными картами et c.), или как реализовать функцию hashCode для такого класса ключей, если это вообще возможно.

1 Ответ

0 голосов
/ 23 января 2020

Это невозможно, если я правильно понимаю ваш вопрос. Я думаю, что для этого вам нужно использовать что-то еще, кроме HashMap.

HashMap использует hashcode / equals методы класса ключей для сопоставления, поэтому я интерпретирую ваш вопрос как реализовать эти методы.

hashcode на самом деле легко. Я думаю, что ваш единственный вариант - вернуть константу. Это глупая идея, но она будет необходима, если «default» будет соответствовать чему-либо.

equals невозможно реализовать. Соответствие, которое вы описываете, не будет симметричным c и транзитивным, как того требует документация (https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals (java .lang.Object) ).

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