41

我有以下类型的哈希图

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

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

18在行中添加新号码时出现错误map.put(string,number);

4

8 回答 8

57

我们的变量:

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

储藏:

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

要添加数字一和一,您可以执行以下操作:

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

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

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.
}
于 2013-10-23T12:25:44.220 回答
2

你可以这样使用(虽然随机数生成器的逻辑不符合标准)

public class WorkSheet {
    HashMap<String,ArrayList<Integer>> map = new HashMap<String,ArrayList<Integer>>();

public static void main(String args[]) {
    WorkSheet test = new WorkSheet();
    test.inputData("mango", 5);
    test.inputData("apple", 2);
    test.inputData("grapes", 2);
    test.inputData("peach", 3);
    test.displayData();

}
public void displayData(){
    for (Entry<String, ArrayList<Integer>> entry : map.entrySet()) {
        System.out.print(entry.getKey()+" | ");
        for(int fruitNo : entry.getValue()){
            System.out.print(fruitNo+" ");
        }
        System.out.println();
    }
}
public void inputData(String name ,int number) {
    Random rndData = new Random();
    ArrayList<Integer> fruit = new ArrayList<Integer>();
    for(int i=0 ; i<number ; i++){
        fruit.add(rndData.nextInt(10));
    }
    map.put(name, fruit);
}
}

输出

grapes | 7 5 
apple | 9 5 
peach | 5 5 8 
mango | 4 7 1 5 5 
于 2013-10-23T12:40:26.373 回答
2
Iterator it = map.entrySet().iterator();
while (it.hasNext()) {
     Map.Entry pairs = (Map.Entry)it.next();

     if(pairs.getKey().equals("mango"))
     {
        map.put(pairs.getKey(), pairs.getValue().add(18));
     }

     else if(!map.containsKey("mango"))
     {
        List<Integer> ints = new ArrayList<Integer>();
        ints.add(18);
        map.put("mango",ints);
     }

     it.remove(); // avoids a ConcurrentModificationException
}

编辑:所以在里面试试这个:

map.put(pairs.getKey(), pairs.getValue().add(number))

您收到错误是因为您尝试将整数放入值中,而预期为ArrayList.

编辑2:然后将以下内容放入您的while循环中:

if(pairs.getKey().equals("mango"))
{
    map.put(pairs.getKey(), pairs.getValue().add(18));
}

else if(!map.containsKey("mango"))
{
     List<Integer> ints = new ArrayList<Integer>();
     ints.add(18);
     map.put("mango",ints);
 }

编辑3:通过阅读您的要求,我认为您可能不需要循环。您可能只想检查映射是否包含键mango,如果确实添加18,则在映射中使用键mango和值创建一个新条目18

因此,您可能需要的只是以下内容,没有循环:

if(map.containsKey("mango"))
{
    map.put("mango", map.get("mango).add(18));
}

else
{
    List<Integer> ints = new ArrayList<Integer>();
    ints.add(18);
    map.put("mango", ints);
}
于 2013-10-23T12:28:59.493 回答
2

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

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

根据Map.computeIfAbsent文档:

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

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

迭代列表映射最惯用的方法是使用Map.forEachand Iterable.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 */
    }
}
于 2020-11-11T17:45:01.677 回答
1

您可以尝试使用 MultiMap 而不是 HashMap

初始化它将需要更少的代码行。添加和检索值也会使其更短。

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

会成为:

Multimap<String, Integer> multiMap = ArrayListMultimap.create();

您可以查看此链接:http: //java.dzone.com/articles/hashmap-%E2%80%93-single-key-and

于 2013-10-28T00:05:46.170 回答
0
for (Map.Entry<String, ArrayList<Integer>> entry : map.entrySet()) {
 System.out.println( entry.getKey());     
 System.out.println( entry.getValue());//Returns the list of values
}
于 2013-10-23T12:25:40.030 回答
0

方法 1:使用 putIfAbsent

    Map<String, List<Integer>> map = new HashMap();
    map.putIfAbsent("mango",new ArrayList<>());
    map.get("mango").add(5);

方法 2:检查 Map 中存在的键

    Map<String, List<Integer>> map = new HashMap();
    if(! map.containsKey("mango"){
          map.put("mango",new ArrayList<>());
    }
    List<Integer> list = map.get("mango");
    list.add(3);
  
    

方法 3:使用 getOrDefault

    Map<String, List<Integer>> map = new HashMap();
    List<Integer> list = map.getOrDefault("mango",new ArrayList<>());
    list.add(4)

      
  
于 2021-12-09T19:30:52.203 回答
-1

一次获取所有=

List<Integer> list = null;

if(map!= null) 
{ 
  list = new ArrayList<Integer>(map.values()); 
}

用于存储 =

if(map!= null) 
{ 
  list = map.get(keyString); 
   if(list == null)
    {
         list = new ArrayList<Integer>();
    }
  list.add(value);
  map.put(keyString,list);
}
于 2013-10-23T12:27:56.873 回答