Извлечение элементов ArrayList <String>как часть Hashmap - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть следующий код:

for (Map.Entry < Integer, ArrayList < String >> entry: data.entrySet()) {
    Integer key = entry.getKey();
    ArrayList < String > value = entry.getValue();
    for (String aString: value) {
        System.out.println("key : " + key + " value : " + aString);
    }
}

Hashmap объявляется как

Map<Integer, List<String>> data = new HashMap<>();

перед заполнением его с помощью цикла и put методов.

Iтеперь нужно перебрать ArrayList строк или лучше, извлечь определенные элементы по индексу .. для манипуляции.Я исследовал, насколько я могу, и, кажется, нашел ответ, с приведенным выше кодом.Он был скопирован из ответа, данного здесь некоторое время назад.

Однако, когда я пытаюсь использовать его, он жалуется на «Несовместимые типы» с верхней строкой, подчеркнутой красным до двоеточия.

  • Обязательно: Entry <Integer,java.util.List<java.lang.String>>
  • Найдено: Entry <Integer,java.util.ArrayList<java.lang.String>>

Ответы [ 4 ]

0 голосов
/ 27 сентября 2018

Программа против интерфейса, а не против реализации.

Тип карты - Integer в качестве ключа и List<String> в качестве значения.Таким образом, вы можете зацикливать записи только с одинаковой структурой.

for (Map.Entry < Integer, List < String >> entry: data.entrySet()) {
    Integer key = entry.getKey();
    List <String> value = entry.getValue();
    for (String aString: value) {
        System.out.println("key : " + key + " value : " + aString);
    }
}
0 голосов
/ 27 сентября 2018

Попробуйте код ниже:

for (Map.Entry<Integer, List<String>> entry : data.entrySet()) {
       Integer key = entry.getKey();
       List<String> value = entry.getValue();
       for(String aString : value){
            System.out.println("key : " + key + " value : " + aString);
            }
0 голосов
/ 27 сентября 2018

В вашем случае у вас есть интерфейс List и реализация ArrayList, вы правильно использовали тип List в объявлении карты, но вы перешли к объявлению реализации (ArrayList) вloop.

Проблема возникает из-за утверждения:

Map<Integer, List<String>> data = new HashMap<>();

Пустая нотация ромба оставляет много возможностей для реализации List<String>.Это может быть ArrayList, LinkedList и т. Д. Таким образом, вы не можете быть уверены, что компилятор будет использовать ArrayList реализацию.

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

0 голосов
/ 27 сентября 2018

потому что вы объявили тип значения в Hashmap как List<String>, а ArrayList<String> как тип значения Map.Entry в for loop.

изменить Map<Integer, List<String>> data = new HashMap<>(); на Map<Integer, ArrayList<String>> data = new HashMap<>();

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