列表为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的代码,而是输出示例。