MultiMap с коллекцией <String> - PullRequest
0 голосов
/ 14 декабря 2018

Я работаю над файлом XML.В моем XML-файле есть некоторые узлы, которые имеют дочерние элементы.Этот XML-файл имеет несколько тегов.

<Cat categorie="CAT 1" guid="e9fdsd8ff">
    <!--Electric energie management-->
    **<item Var="VAR1" guid="2795ddsd410d">
        <desc> Energie Smart Management 
        </desc>
        <App guid="240adsqsd" />
        <App guid="90dqddqsq" />**
    </item>
</Cat>

Как вы можете видеть, мой узел "item" имеет аргумент VAR = var1 и имеет 2 дочерних элемента.Итак, я создал hashMap для размещения на 1 узел его потомков, как показано ниже

private Map<String, Collection <String >> multiMap = new HashMap <> ();

Итак, у меня есть что-то подобное на самом деле: [Key=Var1, Value = [gui0,guid1,...]]

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

Например, если у меня есть эта строка: 240adsqsd.Я хочу восстановить Var1.

Спасибо за помощь

Ответы [ 4 ]

0 голосов
/ 14 декабря 2018

Спасибо всем за ваши ответы.

Если я правильно понимаю, желательно, чтобы я искал значение, а не его ключ.

Так что давайте признаем, что я выбрал этот вариант.

Могу ли я восстановить каждое значение для ключа.

Если мой ключ, например, Var1, было бы лучше для меня восстановить все его значения?

0 голосов
/ 14 декабря 2018

Тест без модификации карты будет выглядеть так:

boolean contained = multiMap.getOrDefault(key, Collections.emptyList()).contains(key);

Тогда есть Map.computeIfAbsent, computeIfPresent, merge, если вы хотите обновить карту.

0 голосов
/ 14 декабря 2018

Если я понимаю ваш вопрос, вы на самом деле хотите изменить свою карту, потому что карта хороша для доступа к значению по ключу, а не для поиска ключа по значению.Вот некоторый псевдокод для построения карты:

map = new Map()
for item in items
    for app in item.apps
        map.put(app.guid, item.guid) // assuming guids are always unique

Это даст вам Map<String, String>, а не Map<String, Collection<String>>.Первый - хороший способ сообщить вам, какой элемент содержит приложение, второй - хороший способ сообщить, какие приложения содержит данный элемент.Учитывая вашу карту обратного отображения, вы сможете сделать следующее:

// could just have Map<App, Item> appToItem if you build your map differently 
// and App and Item define hashCode and equals
public boolean findVar(String appId, Map<String, String> appToItem, Map<String, Item> itemsById) {
    Item item = itemsById.get(appToItem.get(appId));
    if (item == null) return null;
    return item.getVar();
}
0 голосов
/ 14 декабря 2018

Это возможно.Скажем, у вас есть ключ myKey и вы хотите узнать, содержится ли в коллекции за этим ключом строка mySearchString.

multiMap.get("myKey").contains("mySearchString");

Она вернет true, если mySearchString равно (с учетом регистра) любого объекта в коллекции.

Вы должны быть осторожны, хотя метод contains в коллекции использует чувствительный к регистру метод equals и будет работать только тогда, когда они равны на 100%.Поэтому, когда ваша коллекция содержит что-то вроде "MYSEARCHstring", она не будет работать, а также "The sentence that contains mySearchString".

РЕДАКТИРОВАТЬ:
(Спасибо, Николас и Дичи)
Вот более полный пример, как этого добиться.

String mySearchString = "mySearchString";
Map<String, Collection<String>> multiMap = new HashMap<>();
for (String key : multiMap.keySet()) {
    if (multiMap.get(key) != null && multiMap.get(key).contains(mySearchString)) {
        return key;
    }
}

Если вы не знаете ключ, вам нужно перебрать карту, проверить, содержит ли одна из коллекций искомую строку, а затем, когда вы нашли коллекцию (и ее ключ), вернутьключ.

...