2015-10-03 5 views
1

как я могу получить ключ от моего значения?Получить значение от ключа, значение - это список

Мой HashMap:

public static final Map<String, List<String>> Server = new HashMap<>(); 

моя попытка:

public static Object getKeyFromValue(String value) { 
     for (Object o : Server.keySet()) { 
      if (Server.get(o).equals(value)) { 
       return o; 
      } 
     } 
     return null; 
    } 

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

+0

Итак, если я правильно понял, вы хотите вернуть список, хранящийся под определенным ключом? Или что вы пытаетесь выполнить? – Zaheylu

ответ

0

Когда вы итерацию над Map, если вам нужен ключ и значение, что лучше перебрать entrySet, а не keySet.

public static String getKeyFromValue(String value) { 
    for (Map.Entry<String, List<String>> e : Server.entrySet()) { 
     if (e.getValue().contains(value)) { 
      return e.getKey(); 
     } 
    } 
    return null; 
} 

Это должно работать, но есть 3 вещи, которые мне не нравятся об этом (кроме Server, начиная с прописной буквы).

  1. contains для многих List реализаций (включая ArrayList и LinkedList) медленно, потому что это линейный поиск. Вместо этого лучше использовать HashSet.
  2. Если value встречается в нескольких списках на карте, возвращаемый ключ может быть любым из нескольких ответов. Может быть лучше, чтобы имя метода указывало это (например, getAnyKeyForValue).
  3. Может быть предпочтительнее вернуть Optional<String>, а не использовать null, чтобы это значение не было найдено.

Java, 8 решение, принимая все эти пункты во внимание и пользуясь параллельности бы

public static Optional<String> getAnyKeyForValue(String value) { 
    return Server.entrySet() 
       .parallelStream() 
       .filter(e->e.getValue().contains(value)) 
       .map(Map.Entry::getKey) 
       .findAny(); 
} 
0

Просто меняется от равняется содержит работы. и все остается неизменным

public static Object getKeyFromValue(String value) { 
    for (Object o : Server.keySet()) { 
     if (Server.get(o).contains(value)) { 
      return o; 
     } 
    } 
    return null; 
} 
Смежные вопросы