Вытяните запись из списка ‹String›, вложенного в HashMap

Я новичок в Java, поэтому терпите меня.

У меня есть HashMap списков.

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

Я повторяю каждую запись HashMap и отображаю ее, используя:

for (Map.Entry<Integer, List<String>> entry : contactList.entrySet()) {
            System.out.println(entry.getKey() + " - " + entry.getValue());
        }

Теперь мой список хранится в entry.getValue (), но мне нужны только первая, вторая и третья записи из этих списков. Я считаю, что мне нужно назначить список его собственному объекту до итерации, но я не могу извлечь список из HashMap.

Выходные данные должны отображать каждую запись HashMap, включая ее ключ, но только первые 3 элемента списка.


person vbiqvitovs    schedule 22.02.2014    source источник


Ответы (5)


Просто распечатайте subList без изменения ваших данных:

System.out.println(entry.getKey() + " - " + entry.getValue().subList(0, 3));

Предполагается, что ваш список содержит более двух элементов, иначе вы можете использовать Math.min(3, entry.getValue().size()) (как указано в комментариях), чтобы избежать IndexOutOfBoundsException.

Следовательно,

System.out.println(entry.getKey() + " - " + entry.getValue().subList(0, Math.min(3, entry.getValue().size())));
person StoopidDonut    schedule 22.02.2014
comment
Этот ответ намного лаконичнее и элегантнее моего (я, очевидно, недостаточно об этом подумал). Хотя вы могли бы сделать подсписок с Math.min(3, entry.getValue().size()), если он короче. - person Gorkk; 22.02.2014
comment
Очень хороший ответ, так держать! - person Keerthivasan; 22.02.2014
comment
@Gorkk спасибо, я сделал предположение, основанное на требовании OP, но ваше предложение сделает решение точным - person StoopidDonut; 22.02.2014

Вы можете сделать это вот так. Я сделал его подробным, чтобы помочь вам лучше понять. Этот код можно сделать короче

   Map<Integer, List<String>> contactList = new HashMap<Integer, List<String>>();
    for (Map.Entry<Integer, List<String>> entry : contactList.entrySet()) {
        Integer integer = entry.getKey();
        List<String> list =  entry.getValue();
        //first item
        String first = list.get(0);
        //second item  
         String second = list.get(1);
        //third item
        String third = list.get(2);
    }

Надеюсь, поможет!

person Keerthivasan    schedule 22.02.2014
comment
это вызовет исключения, если список короче 3 - person zibi; 22.02.2014
comment
Я предоставил ответ, так как OP упомянул, что в нем есть три элемента - person Keerthivasan; 22.02.2014
comment
Спасибо, это именно то, что я искал. Это дает мне необходимую степень детализации для назначения и вывода объектов. - person vbiqvitovs; 22.02.2014
comment
@zibi Конструктор требует, чтобы в списке было не менее 3 пунктов. - person vbiqvitovs; 22.02.2014

Приведенный ниже код должен дать вам то, что вы хотите.

for (Map.Entry<Integer, List<String>> entry : contactList.entrySet()) {
    List<String> values = entry.getValue();
    StringBuilder builder = new StringBuilder(entry.getKey()).append(" - ");
    // here I assume the values list is never null, and we pick at most the first 3 entries
    builder.append("[")
    for (int i = 0; i < Math.min(3, values.size()); i++) {
        if (i > 0) builder.append(", ");
        builder.append(values.get(i));
    }
    builder.append("[");
    System.out.println(builder.toString());
}

Что он делает для каждой записи на карте:

  1. создать локальную переменную со значением (a List<String>)
  2. создать StringBuilder для построения вывода на записи
  3. перебирать первые 3 элемента (или меньше, если список короче) при построении вывода
  4. вывести строку в построителе

Конечно, есть более элегантный способ сделать это, если вы думаете об этом, это просто быстрое базовое решение вашей проблемы.

person Gorkk    schedule 22.02.2014

Как насчет чего-то вроде этого:

String result = "";
List<String> strings = entry.getValue();
for (int i = 0; i < strings.size(); i++)
{
    result += strings.get(i);
}
person verhage    schedule 22.02.2014

Мой друг, ты можешь сделать это

 Map<Integer, List<String>> contactList = new HashMap<Integer, List<String>>();
            for (Map.Entry<Integer, List<String>> entry : contactList.entrySet()) {
                List<String> list =  entry.getValue();
                String firstItem = list.get(0);
                String secondItem = list.get(1);
                String thirdItem = list.get(2);

            }
person Girish    schedule 22.02.2014