列表为Java中hashMap的值
文件: 我尝试的是:列表为Java中hashMap的值,java,data-structures,collections,Java,Data Structures,Collections,文件: 我尝试的是: Person1:AP Person2:AP Person3:KE Person4:KE Person5:UK Person6:AP Person7:UK Person8:AP 以下是你需要的- {AP = [person1, person 2, person6, person8], KE = [person3, person4], UK = [person5, person7]} 每行- Map<String, List<String>> h =
Person1:AP
Person2:AP
Person3:KE
Person4:KE
Person5:UK
Person6:AP
Person7:UK
Person8:AP
以下是你需要的-
{AP = [person1, person 2, person6, person8], KE = [person3, person4], UK = [person5, person7]}
每行-
Map<String, List<String>> h = new HashMap<String, List<String>>();
以下是你需要的-
{AP = [person1, person 2, person6, person8], KE = [person3, person4], UK = [person5, person7]}
每行-
Map<String, List<String>> h = new HashMap<String, List<String>>();
put将替换您已经插入到哈希映射中的任何元素。您需要首先尝试检索映射中的现有键,如果该键已存在(即已为上一个输入行插入),则可以将当前名称附加到其值,然后将其重新插入映射中
此外,您可能希望使用类似List的东西来保存映射值和名称,而不仅仅是字符串。使用列表还可以省去重新插入值的需要,因为您可以直接应用到映射中已经存在的列表。HashMap.put将替换您已经插入到哈希映射中的任何元素。您需要首先尝试检索映射中的现有键,如果该键已存在(即已为上一个输入行插入),则可以将当前名称附加到其值,然后将其重新插入映射中
此外,您可能希望使用类似List的东西来保存映射值和名称,而不仅仅是字符串。使用列表还可以省去重新插入值的需要,因为您可以直接应用到地图中已有的列表。您只需更改地图的while和类型:
String[] s = str.split(":"); //s[1] should be the key, s[0] is what should go into the list
List<String> l = h.get(s[1]); //see if you already have a list for current key
if(l == null) { //if not create one and put it in the map
l = new ArrayList<String>();
h.put(s[1], l);
}
l.add(s[0]); //add s[0] into the list for current key
您只需更改地图的while和类型:
String[] s = str.split(":"); //s[1] should be the key, s[0] is what should go into the list
List<String> l = h.get(s[1]); //see if you already have a list for current key
if(l == null) { //if not create one and put it in the map
l = new ArrayList<String>();
h.put(s[1], l);
}
l.add(s[0]); //add s[0] into the list for current key
要将该地图翻转过来,您可能需要:
Map<String, List<String>> h = new HashMap<String, List<String>>();
/* (...) */
while ( (str = br.readLine()) != null) {
String[] s = str.split(":");
list = h.get(s[1]);
if(list==null) {
list = new ArrayList<String>();
}
list.add(s[0]);
h.put(s[1],list);
}
现在,地图包含了所需的结构化数据,AP指向arraylist person1、Person2、person6、person8等。若要颠倒地图,您可能需要:
Map<String, List<String>> h = new HashMap<String, List<String>>();
/* (...) */
while ( (str = br.readLine()) != null) {
String[] s = str.split(":");
list = h.get(s[1]);
if(list==null) {
list = new ArrayList<String>();
}
list.add(s[0]);
h.put(s[1],list);
}
现在map包含了所需的结构化数据,AP指向arraylist person1、Person2、person6、person8等。其他解决方案的替代方案是使用Guava的一种多地图实现。如果这是您仅有的一张这样的地图,那么添加这样的依赖性可能有点过头了,但是如果您最终得到了一堆这样性质的地图,最好不要把这个样板文件弄得到处都是:
HashMap<String, String> h = new HashMap<String, String>();
...
// your reading code
...
HashMap<String,ArrayList<String>> map = new HashMap<String,ArrayList<String>>();
...
for(String key: h.keySet()) {
if(!map.hasKey(key)) {
map.put(key, new ArrayList<String>());
}
map.get(key).add(h.get(key));
}
相反。根据您的具体需求,有许多实现
分类:
与添加它们的顺序相同:
不关心订购:
其他解决方案的替代方案是使用Guava的Multimap实现之一。如果这是您仅有的一张这样的地图,那么添加这样的依赖性可能有点过头了,但是如果您最终得到了一堆这样性质的地图,最好不要把这个样板文件弄得到处都是:
HashMap<String, String> h = new HashMap<String, String>();
...
// your reading code
...
HashMap<String,ArrayList<String>> map = new HashMap<String,ArrayList<String>>();
...
for(String key: h.keySet()) {
if(!map.hasKey(key)) {
map.put(key, new ArrayList<String>());
}
map.get(key).add(h.get(key));
}
相反。根据您的具体需求,有许多实现
分类:
与添加它们的顺序相同:
不关心订购:
你到底在问什么?你到底在问什么?提示:OP正在寻找LinkedHashMap而不是HashMap。读取所需的输出。@gthm geeky:如果应该保持行的读取顺序,那么按照Luiggi的建议,用新的LinkedHashMap替换新的HashMap。@Luiggmendoza:OP的Perl示例并不表示他想使用LinkedHashmap@AdrianPronk我从没说过要检查perl的代码,而是输出示例。提示:OP正在查找LinkedHashMap而不是HashMap。读取所需的输出。@gthm geeky:如果应该保持行的读取顺序,那么按照Luiggi的建议,用新的LinkedHashMap替换新的HashMap。@Luiggmendoza:OP的Perl示例并不表示他想使用LinkedHashmap@AdrianPronk我从未说过要检查perl的代码,而是输出示例。