从哈希映射中存储和检索 ArrayList 值

2022-09-01 01:31:47

我有以下类型的哈希映射

HashMap<String,ArrayList<Integer>> map=new HashMap<String,ArrayList<Integer>>();    

存储的值如下所示:

mango | 0,4,8,9,12
apple | 2,3
grapes| 1,7
peach | 5,6,11

我想使用迭代器或任何其他方式以最少的代码行数存储和获取这些整数。我该怎么做?

编辑 1

这些数字是随机相加的(不是一起),因为键与相应的行匹配。

编辑 2

如何在添加时指向数组列表?

我在行中添加新数字时遇到错误18map.put(string,number);


答案 1

我们的变量:

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

要存储:

map.put("mango", new ArrayList<Integer>(Arrays.asList(0, 4, 8, 9, 12)));

要将数字 1 和 1 相加,可以执行如下操作:

String key = "mango";
int number = 42;
if (map.get(key) == null) {
    map.put(key, new ArrayList<Integer>());
}
map.get(key).add(number);

在 Java 8 中,您可以使用 来添加列表(如果该列表尚不存在):putIfAbsent

map.putIfAbsent(key, new ArrayList<Integer>());
map.get(key).add(number);

使用该方法循环访问:map.entrySet()

for (Entry<String, List<Integer>> ee : map.entrySet()) {
    String key = ee.getKey();
    List<Integer> values = ee.getValue();
    // TODO: Do something.
}

答案 2

在Java中向多映射(列表映射)添加条目的现代方法(截至2020年)是:

map.computeIfAbsent("apple", k -> new ArrayList<>()).add(2);
map.computeIfAbsent("apple", k -> new ArrayList<>()).add(3);

根据Map.computeIfAbsent docs:

如果指定的键尚未与值关联(或映射到 ),则会尝试使用给定的映射函数计算其值,并将其输入到此映射中,除非 。nullnull

返回:the current (existing or computed) value associated with the specified key, or null if the computed value is null

迭代列表映射的最惯用方法是使用 Map.forEachIterable.forEach

map.forEach((k, l) -> l.forEach(v -> /* use k and v here */));

或者,如其他答案所示,传统的循环:for

for (Map.Entry<String, List<Integer>> e : map.entrySet()) {
    String k = e.getKey();
    for (Integer v : e.getValue()) {
        /* use k and v here */
    }
}