Как для каждого хэшмапа?
У меня есть это поле:
HashMap<String, HashMap> selects = new HashMap<String, HashMap>();
Для каждого Hash<String, HashMap>
мне нужно создать ComboBox
, чьими элементами являются значение (которое является самой HashMap) HashMap <String, **HashMap**>
.
В качестве (не функционирующей) демонстрации:
for (int i=0; i < selects.size(); i++) {
HashMap h = selects[i].getValue();
ComboBox cb = new ComboBox();
for (int y=0; y < h.size(); i++) {
cb.items.add(h[y].getValue);
}
}
Ответы
Ответ 1
Я знаю, что я немного опаздываю на это, но я поделюсь тем, что я тоже сделал, если это поможет кому-то еще:
HashMap<String, HashMap> selects = new HashMap<String, HashMap>();
for(Map.Entry<String, HashMap> entry : selects.entrySet()) {
String key = entry.getKey();
HashMap value = entry.getValue();
// do what you have to do here
// In your case, another loop.
}
Ответ 2
Lambda Выражение Java 8
В Java 1.8 (Java 8) это стало намного проще с помощью метода forEach из операций агрегации (Операции с потоком), который похож на итераторы из Iterable.
Просто скопируйте пасту ниже инструкции в свой код и переименуйте переменную HashMap из hm в свою переменную HashMap, чтобы распечатать пару ключ-значение.
HashMap<Integer,Integer> hm = new HashMap<Integer, Integer>();
/*
* Logic to put the Key,Value pair in your HashMap hm
*/
// Print the key value pair in one line.
hm.forEach((k,v) -> System.out.println("key: "+k+" value:"+v));
Вот пример, где используется Lambda Expression:
HashMap<Integer,Integer> hm = new HashMap<Integer, Integer>();
Random rand = new Random(47);
int i=0;
while(i<5){
i++;
int key = rand.nextInt(20);
int value = rand.nextInt(50);
System.out.println("Inserting key: "+key+" Value: "+value);
Integer imap =hm.put(key,value);
if( imap == null){
System.out.println("Inserted");
}
else{
System.out.println("Replaced with "+imap);
}
}
hm.forEach((k,v) -> System.out.println("key: "+k+" value:"+v));
Output:
Inserting key: 18 Value: 5
Inserted
Inserting key: 13 Value: 11
Inserted
Inserting key: 1 Value: 29
Inserted
Inserting key: 8 Value: 0
Inserted
Inserting key: 2 Value: 7
Inserted
key: 1 value:29
key: 18 value:5
key: 2 value:7
key: 8 value:0
key: 13 value:11
Кроме того, для этого можно использовать Spliterator.
Spliterator sit = hm.entrySet().spliterator();
UPDATE
Включая ссылки документации к документам Oracle.
Подробнее о Lambda перейдите по этой ссылке и вы должны прочитать Агрегированные операции и для Spliterator перейдите к этой ссылке.
Ответ 3
Map.values()
:
HashMap<String, HashMap<SomeInnerKeyType, String>> selects =
new HashMap<String, HashMap<SomeInnerKeyType, String>>();
...
for(HashMap<SomeInnerKeyType, String> h : selects.values())
{
ComboBox cb = new ComboBox();
for(String s : h.values())
{
cb.items.add(s);
}
}
Ответ 4
Вы можете выполнять итерацию по HashMap
(и многим другим коллекциям) с помощью итератора, например:
HashMap<T,U> map = new HashMap<T,U>();
...
Iterator it = map.values().iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
Ответ 5
Я вообще делаю то же самое, что и cx42net, но я явно не создаю запись.
HashMap<String, HashMap> selects = new HashMap<String, HashMap>();
for (String key : selects.keySet())
{
HashMap<innerKey, String> boxHolder = selects.get(key);
ComboBox cb = new ComboBox();
for (InnerKey innerKey : boxHolder.keySet())
{
cb.items.add(boxHolder.get(innerKey));
}
}
Это кажется мне наиболее интуитивным, я думаю, что я предвзято против итерации над значениями карты.
Ответ 6
Потоки Java 8
Наряду с методом forEach
который принимает лямбда-выражения, у нас также есть потоковые API в Java 8.
Итерировать записи (используя forEach и Streams):
sample.forEach((k,v) -> System.out.println(k + "=" + v));
sample.entrySet().stream().forEachOrdered((entry) -> {
Object currentKey = entry.getKey();
Object currentValue = entry.getValue();
System.out.println(currentKey + "=" + currentValue);
});
sample.entrySet().parallelStream().forEach((entry) -> {
Object currentKey = entry.getKey();
Object currentValue = entry.getValue();
System.out.println(currentKey + "=" + currentValue);
});
Преимущество потоков состоит в том, что они могут быть легко распараллелены и могут быть полезны, когда у нас есть несколько процессоров. Нам просто нужно использовать parallelStream()
вместо stream()
выше. С параллельными потоками имеет смысл использовать forEach
как forEachOrdered
будет иметь никакого значения в производительности. Если мы хотим sample.keySet()
ключи, мы можем использовать sample.keySet()
и для значений sample.values()
.
Почему forEachOrdered
и не forEach
с потоками?
Потоки также предоставляют метод forEach
но поведение forEach
явно недетерминировано, когда forEachOrdered
выполняет действие для каждого элемента этого потока в порядке обнаружения потока, если поток имеет определенный порядок встречи. Таким образом, forEach
не гарантирует, что заказ будет сохранен. Также проверьте это для большего.
Ответ 7
Используйте entrySet
,
/**
*Output:
D: 99.22
A: 3434.34
C: 1378.0
B: 123.22
E: -19.08
B new balance: 1123.22
*/
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MainClass {
public static void main(String args[]) {
HashMap<String, Double> hm = new HashMap<String, Double>();
hm.put("A", new Double(3434.34));
hm.put("B", new Double(123.22));
hm.put("C", new Double(1378.00));
hm.put("D", new Double(99.22));
hm.put("E", new Double(-19.08));
Set<Map.Entry<String, Double>> set = hm.entrySet();
for (Map.Entry<String, Double> me : set) {
System.out.print(me.getKey() + ": ");
System.out.println(me.getValue());
}
System.out.println();
double balance = hm.get("B");
hm.put("B", balance + 1000);
System.out.println("B new balance: " + hm.get("B"));
}
}
Смотрите полный пример здесь: