从hashmap存储和检索ArrayList值
我有一个以下类型的hashmap
HashMap<String,ArrayList> map=new HashMap<String,ArrayList>();
存储的值如下:
mango | 0,4,8,9,12 apple | 2,3 grapes| 1,7 peach | 5,6,11
我想存储以及使用Iterator或任何其他方式使用最少的代码行获取那些整数。我该怎么办?
编辑1
当密钥与适当的行匹配时,数字是随机添加的(不是一起)。
编辑2
添加时如何指向arraylist?
我在行map.put(string,number);
添加一个新的数字18
时遇到错误map.put(string,number);
我们的变量:
Map> map = new HashMap>();
储藏:
map.put("mango", new ArrayList(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()); } map.get(key).add(number);
在Java 8中,如果列表已经不存在,您可以使用putIfAbsent
添加列表:
map.putIfAbsent(key, new ArrayList()); map.get(key).add(number);
使用map.entrySet()
方法迭代:
for (Entry> ee : map.entrySet()) { String key = ee.getKey(); List values = ee.getValue(); // TODO: Do something. }
你可以这样使用(虽然随机数生成器逻辑不符合标记)
public class WorkSheet { HashMap> map = new HashMap>(); 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> 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 fruit = new ArrayList (); for(int i=0 ; i
OUTPUT
grapes | 7 5 apple | 9 5 peach | 5 5 8 mango | 4 7 1 5 5
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 ints = new ArrayList (); 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 ints = new ArrayList (); 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 ints = new ArrayList (); ints.add(18); map.put("mango", ints); }
for (Map.Entry> entry : map.entrySet()) { System.out.println( entry.getKey()); System.out.println( entry.getValue());//Returns the list of values }
一次取所有=
List list = null; if(map!= null) { list = new ArrayList (map.values()); }
对于存储=
if(map!= null) { list = map.get(keyString); if(list == null) { list = new ArrayList(); } list.add(value); map.put(keyString,list); }
您可以尝试使用MultiMap而不是HashMap
初始化它将需要更少的代码行。 添加和检索值也会缩短它。
Map> map = new HashMap>();
会成为:
Multimap multiMap = ArrayListMultimap.create();
您可以查看以下链接: http : //java.dzone.com/articles/hashmap-%E2%80%93-single-key-and