我想创建一个定义为HashMap<Character,ArrayList<String>>
的散列图。
我想要做的是读取一组我正在读入列表的字符串。
从这个列表中我想生成这个hashmap。
所以如果字符串是这样的
Andy,Aman,Rocky,Ravi,Nick等。 地图应该像
A->[Andy,Aman]
R->[Rocky,Ravi]
N->Nick
我尝试的是这样的
ArrayList<String> xlist= new ArrayList<String>();
ArrayList<String> list = new ArrayList<String>();
HashMap<Character,ArrayList<String>> h = new HashMap<Character,ArrayList<String>>();
Scanner s = new Scanner(System.in);
for(String sin : list){
Character x =sin.charAt(0);
//System.out.println(sin.charAt(0));
if(h.containsKey(x)){
h.get(x).add(sin);
//xlist.clear();
//xlist = h.get(x);
//xlist.add(sin);
//h.put(x,xlist.clone());
}
else{
xlist.clear();
xlist.add(sin);
h.put(x,xlist);
}
}
当我打印hashmap时,我得到了这个
{A=[Ravi, Rocky], R=[Ravi, Rocky], N=[Ravi, Rocky]}
我理解,值中的所有列表都是从列表的同一副本中反映出来的,但我不知道如何解决它。
答案 0 :(得分:3)
如果您不想重写循环,只需更改else块中的最后一行,这样您就不会在每次迭代时更改地图内容:
h.put(x,new ArrayList<String>(Arrays.asList(sin)));
您也可以使用Java 8 Streams来缩短它的时间:
Map<Character, List<String>> map = list.stream().collect(Collectors.groupingBy(d -> d.charAt(0)));
如果要保留键的顺序,可以将它与LinkedHashMap一起使用:
Map<Character, List<String>> map = list.stream().collect(Collectors.groupingBy(d->d.charAt(0), LinkedHashMap::new, Collectors.toList()));
答案 1 :(得分:1)
xlist
始终是相同的列表,即使您已将其放入hashmap中也是如此。每当你点击一个新的字母时,你清除hashmap中的每个列表,并将当前的单词添加到每个列表中,因为它们都是相同的列表。
我将你的循环重写为:
for(String sin : list){
Character x =sin.charAt(0);
if(!h.containsKey(x)){
h.put(x, new ArrayList<String>());
}
h.get(x).add(sin);
}