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