Hashmap в Hashmap Поиск - PullRequest
       1

Hashmap в Hashmap Поиск

0 голосов
/ 04 ноября 2018
Map<Integer, HashMap<String, Integer>> map = new HashMap<Integer, 

HashMap<String, Integer>>();
map.put(1, new HashMap<>());
map.get(1).put("123",5);
map.get(1).put("124",3);
// i store (id, isbn, rate) in Hashmap in Hashmap

map.put(2, new HashMap<>());
map.get(2).put("123",5);
map.get(2).put("122",2);

Как я могу получить идентификатор от ISBN?

Пример я хочу получить id пользователей, которые читают isbn 123? Спасибо.

Ответы [ 3 ]

0 голосов
/ 04 ноября 2018

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

Следующий раздел кода печатает все id для данного targetIsbn

    for (Entry<Integer, HashMap<String, Integer>> entry : map.entrySet()) {
        int id = entry.getKey();
        Map<String, Integer> value = entry.getValue();

        for (Entry<String, Integer> subEntry : value.entrySet()) {
            String isbn = subEntry.getKey();
            int rate = subEntry.getValue();
            if (isbn.equals(targetIsbn))
                System.out.println("given isbn found for id " + id);
        }
    }
0 голосов
/ 04 ноября 2018

Вы можете итерировать карты напрямую:

List<Integer> idsFound = new ArrayList<>(); 
map.forEach((id, innerMap) -> innerMap.forEach((isbn, rate) -> {
    if (isbn.equals(isbnToMatch)) idsFound.add(id);
}));
0 голосов
/ 04 ноября 2018

Нужно подумать пошагово:

  • Перебор пар первого уровня. Карта
  • для каждого, итерация по его паре (Карта второго уровня)
  • если вы найдете пару с хорошим isbn, сохраните идентификатор карты 1-го уровня

Вы можете построить метод следующим образом и вызывать так

List<Integer> listId = getIdFromIsbn("123", map);
static List<Integer> getIdFromIsbn(String isbn, Map<Integer, Map<String, Integer>> map) {
    List<Integer> list = new ArrayList<>();

    for (Map.Entry<Integer, Map<String, Integer>> entry : map.entrySet()) {
        Map<String, Integer> value = entry.getValue();
        for (Map.Entry<String, Integer> subEntry : value.entrySet()) {
            if (subEntry.getKey().equals(isbn)) {
                list.add(entry.getKey());
            }
        }
    }

    return list;
}

Используя Stream и лямбды, это будет выглядеть так:

static List<Integer> getIdFromIsbn(String isbn, Map<Integer, Map<String, Integer>> map) {
    return map.entrySet()                           // Set<Entry<Integer,Map<String,Integer>>>
            .stream()                               // Stream<Entry<Integer,Map<String,Integer>>>
            .flatMap(entry -> entry.getValue().entrySet() // Set<Entry<String,Integer>>
                    .stream()                             // Stream<Entry<String,Integer>>
                    .map(Map.Entry::getKey)               // Stream<String> 
                    .filter(isbn::equals)                 // Stream<String> 
                    .map(subEntry -> entry.getKey()))     // Stream<Integer>
            .collect(Collectors.toList());                // List<Integer>
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...