Java перебирает ArrayList с помощью HashMap в нем
У меня есть хэш-карта с четырьмя ответами. И у меня есть для 2-х вопросов. Вот как я это делаю
// Awnsers question 1
antwoorden1.put("Hypertext Preprocessor", true);
antwoorden1.put("Hypertext PHPprocessor", false);
antwoorden1.put("Hypertext processor", false);
antwoorden1.put("Preprocessor PHP", false);
// Awnsers question 2
antwoorden2.put("Model view config", false);
antwoorden2.put("Model view connect", false);
antwoorden2.put("Model view controllers", false);
antwoorden2.put("Model view controller", true);
Теперь мне нужно получить доступ ко всей этой информации, поэтому я добавлю два HashMaps в один массив ArrayList
// Add the Hashmaps to the arrayList
alleAntwoorden.add(antwoorden1);
alleAntwoorden.add(antwoorden2);
Но как я могу пройти через ArrayList, чтобы получить ключ и значение из HashMap? Это то, что я уже пробовал.
for(int i = 0; i < alleAntwoorden.size(); i++)
{
for (Map.Entry<String, Boolean> entry : alleAntwoorden.get(i).entrySet())
{
String key = entry.getKey();
Object value = entry.getValue();
// ...
}
}
Но я всегда получаю следующий msg: несовместимые типы
Antwoorden1, antwoorden2 и alleAntwoorden определяются как:
private ArrayList<HashMap> alleAntwoorden;
private HashMap<String, Boolean> antwoorden1, antwoorden2;
Ответы
Ответ 1
На следующих интерфейсах:
Map<String, Boolean> map1 = new HashMap<>();
Map<String, Boolean> map2 = new HashMap<>();
List<Map<String, Boolean>> list = new ArrayList<>();
Мы можем перебирать петли foreach:
for (Map<String, Boolean> entry : list) {
for (String key : entry.keySet()) {
Boolean value = entry.get(key);
System.out.println("key = " + key);
System.out.println("value = " + value);
}
}
Ответ 2
Из комментария:
private ArrayList<HashMap> alleAntwoorden;
Это проблема. Вы используете карту исходного типа, но вы пытаетесь назначить одну запись переменной Map.Entry<String, Boolean>
. Это не может работать, потому что ваша текущая карта имеет тип HashMap<Object, Object>
. Измените переменную alleAntwoorden
на:
private List<Map<String, Boolean>> alleAntwoorden;
Разумеется, я также изменил типы на их тип интерфейса: Если вы всегда используете код для интерфейсов в Java.
Ответ 3
Все должно работать со следующими определениями:
Map<String, Boolean> antwoorden1 = new HashMap<>();
Map<String, Boolean> antwoorden2 = new HashMap<>();
List <Map<String, Boolean>> alleAntwoorden = new ArrayList<>();
Ответ 4
Если вы используете Eclipse, вы можете просто написать entry.getValue()
. Поместите курсор поверх него и используйте комбинацию клавиш Ctrl + 2, l, которая автоматически разрешает правильный тип.
Для IntelliJ он работает почти одинаково, но с Ctrl + Alt + v
Ответ 5
Как заявлено другими пользователями, есть более эффективные способы выполнения этой задачи, но если вы хотите использовать свой подход, это функциональный фрагмент кода:
HashMap antwoorden1 = new HashMap();
HashMap antwoorden2 = new HashMap();
// Awnsers question 1
antwoorden1.put("Hypertext Preprocessor", true);
antwoorden1.put("Hypertext PHPprocessor", false);
antwoorden1.put("Hypertext processor", false);
antwoorden1.put("Preprocessor PHP", false);
// Awnsers question 2
antwoorden2.put("Model view config", false);
antwoorden2.put("Model view connect", false);
antwoorden2.put("Model view controllers", false);
antwoorden2.put("Model view controller", true);
ArrayList<HashMap> alleAntwoorden = new ArrayList<HashMap>();
// Add the Hashmaps to the arrayList
alleAntwoorden.add(antwoorden1);
alleAntwoorden.add(antwoorden2);
for(int i = 0; i < alleAntwoorden.size(); i++)
{
Iterator it = (Iterator)alleAntwoorden.get(i).entrySet().iterator();
while (it.hasNext()) {
Map.Entry pairs = (Map.Entry)it.next();
System.out.println(pairs.getKey() + " = " + pairs.getValue());
it.remove(); // avoids a ConcurrentModificationException
}
}