Весь прямой и косвенный ключ значения с карты - PullRequest
0 голосов
/ 06 июля 2019

У меня есть Map<String, Set<String>>.Мое требование состоит в том, чтобы получить все прямые и косвенные ключевые объекты для определенного значения.Например, если данные похожи на:

{
 {'Manager'} => ['Jim', 'Michael'],
 {'Jim'} => ['jim.halpert@theoffice.com'],
 {'Fire Marshal'} => ['Manager', 'Dwight'],
 {'Dwight'} => ['dwight.schrute@theoffice.com'],
 {'Michael'} => ['michael.scott@theoffice.com']
}

Для ввода 'michael.scott@theoffice.com', я должен получить выход ниже.

['Michael', 'Manager', 'Fire Marshal']

Я пробовал ниже коды, но это не работает.Пожалуйста, помогите мне.

 Map<String, Set<String>> addresses;
 String value;//for which we need to search
 Set<String> results = new HashSet<String>();
 Set<String> names;
 do {
    names = addresses.entrySet().stream().filter(entry -> {
         return entry.getValue().contains(value);
    }).map(Map.Entry::getKey).collect(Collectors.toSet());

    results.addAll(names);
 } while (names != null);

1 Ответ

0 голосов
/ 06 июля 2019

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

    Map<String, Set<String>> addresses;
    String value = "michael.scott@theoffice.com";
    Set<String> results = new HashSet<String>();
    Set<String> names = null;
    do {
      String currentSearchValue;
      if(names != null){
        currentSearchValue = names.iterator().next();
      } else {
        currentSearchValue = value;
      }
      names = addresses.entrySet().stream()
                      .filter(entry -> entry.getValue().contains(currentSearchValue))
                      .map(Map.Entry::getKey).collect(Collectors.toSet());
      results.addAll(names);
    } while (names != null && !names.isEmpty());
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...