Как преобразовать значения в 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 но мы получаем ожидаемый результат.