Как преобразовать значения в Hashmap в список

у меня есть Hashmap типа

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

Я хочу иметь возможность перебирать весь hashmap и получать все значения до одного List<String>. Ключи не имеют значения.

Я сделал что-то вроде этого:

List<String> adminValues = new ArrayList<>();

for (Map.Entry<String, List<String>> entry : adminErrorMap.entrySet()) {                
         adminValues.add(entry.getValue().toString());
    }
System.out.println(adminValues);

выход

[[{description=путь к файлу, значение=PurchaseOrder.plsql}, {description=компонент, значение=PURCH}, {description=дата фиксации, value=Thu May 05 00: 32: 01 IST 2016}], [{описание=файл Путь, значение=CustomerOrder.plsql}, {description=компонент, значение=COMP}, {description=дата фиксации, значение=Чт июнь 05 00: 32: 01 IST 2016}]]

как вы можете видеть, есть [] внутри main [].

как получить все значения внутри []. Как показано ниже;

или есть ли другой способ реализовать это?

[{description=путь к файлу, значение=PurchaseOrder.plsql}, {description=компонент, значение=PURCH}, {description=фиксация Дата, value=Thu May 05 00: 32: 01 IST 2016}, {description=путь к файлу, значение=CustomerOrder.plsql}, {description=компонент, значение=COMP}, {description=дата фиксации, значение=Чт июнь 05 00: 32: 01 IST 2016}]

5 ответов


использовать addAll вместо add, для того, чтобы добавить Strings всех List<String>s до одного List<String> :

for (List<String> value : adminErrorMap.values())   
{                
     adminValues.addAll(value);
}

в Java8 вы можете использовать функционал для этого:

adminErrorMap.values().forEach(adminValues::addAll);

кажется, в ваших типах объявлений есть проблема:

Map<String, List<String>> adminErrorMap = new HashMap<>();
List<String> adminValues = new ArrayList<>();

код adminValues ждет String объекты для добавления, но вы пытаетесь добавить объекты типа List<String> в:

for (Map.Entry<String, List<String>> entry : adminErrorMap.entrySet())               
    adminValues.add(entry.getValue().toString());

на entry.getValue(), на основании заявления adminErrorMap, значит не возврат объекта типа String. Вместо этого он возвращает другое List<String>, что совсем не то, что ожидалось. Вы просто звоните toString() на List<String> "объект", который возможно, это не то, чего ты на самом деле хотел.

так как вы не можете поставить List<String> - типизированный объект в контейнер, который ожидает Stringтипизированные объекты, вы должны использовать entry.getKey() вместо:

adminValues.add(entry.getKey());

возможно, следующее Может быть более полезным, если я правильно помню свою Java:

for (String key : adminErrorMap.keySet())
    adminValues.add(key);

Edit для этого комментария:

я хочу только значения всех ключей

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

for (List<String> values : adminErrorMap.values())               
    adminValues.addAll(values);

вам просто нужно сгладить коллекцию. В Java8:

    final Map<String, List<String>> adminErrorMap = ImmutableMap.of(
            "a", Lists.newArrayList("first", "second"),
            "b", Lists.newArrayList("third")
    );

    final List<String> results = adminErrorMap.values().stream()
            .flatMap(Collection::stream)
            .collect(Collectors.toList());

    results.forEach(System.out::println);

он печатает:

first
second
third

почему мы этого не делаем

Map<String, List<String>> mapKeyList = new HashMap<String, List<String>>();
List<String> finalList = new ArrayList<String>();

        Iterator it = mapKeyList.entrySet().iterator();

        while(it.hasNext()){
            Map.Entry pair = (Map.Entry)it.next();
            List<String> strList = (List<String>) pair.getValue();

            Iterator<String> strIt= strList.iterator();
            while(strIt.hasNext()){
                String str = strIt.next();
                finalList.add(str);
            }

        }

Я знаю, что сложность будет в порядок n * n но мы получаем ожидаемый результат.