如何在HashMap中找到键<string,linkedlist <string =“”>&gt;在LinkedList <string>中有一个或多个相似值

时间:2017-03-28 18:30:48

标签: java collections linked-list hashmap duplicates

所以我试图解决以下问题,我使用HashMap作为DS存储输入。

问题: 如果地址簿包含从不同来源(outlook,linkedin,facebook)导入的联系人列表,其中每个联系人都有一个或多个电子邮件地址,请编写一个功能,将所有共享任何电子邮件的联系人分组

输入:

C1: aaa@outlook.com, bbb@gmail.com
​C2: ddd@outlook.com
C3: bbb@gmail.com, aaa@outlook.com, ccc@yahoo.com
C4: ccc@yahoo.com
C5: ddd@outlook.com
C6: eee@outlook.com

我正在寻找输出

((C1,C3,C4),(C2,C5),(C6))​

我试图将hashmap中的所有值都放到一个hashset中,然后如果hashmap中的键包含set中的值,我将该键添加到结果arraylist中。

我使用的代码是:

Set<String> set = new HashSet<>();
        for(Map.Entry<String, LinkedList> entry: hm.entrySet()){
                //System.out.println(entry.getKey()+" "+entry.getValue());  
                set.addAll(entry.getValue());
        }
        ArrayList<String> res1 = new ArrayList<>();
        for(@SuppressWarnings("rawtypes") Map.Entry<String, LinkedList> entry: hm.entrySet()){
            @SuppressWarnings("unchecked")
            Iterator<String> curr = entry.getValue().iterator();
            System.out.println(hm.entrySet());
            while(curr.hasNext()){
                System.out.println("Current= "+curr.next());
                if(set.contains(curr.next())){
                    System.out.println(entry.getKey());
                    res1.add(entry.getKey());
                }
            }
        }   
        System.out.println(set);
        System.out.println(res1);

我得到的输出是:

[C3=[aaa@gmail.com, bbb@outlook.com, ccc@yahoo.com], C4=[ccc@yahoo.com], C5=   
[ddd@outlook.com], C6=[eee@outlook.com], C1=[bbb@outlook.com, 
ddd@outlook.com], C2=[aaa@gmail.com]]

Current= aaa@gmail.com
C3
Current= ccc@yahoo.com
Exception in thread "main" java.util.NoSuchElementException
    at java.util.LinkedList$ListItr.next(LinkedList.java:890)
    at com.logicBuilding.MQ3_HashTable.getCommon(MQ3_HashTable.java:45)
    at com.logicBuilding.MQ3_HashTable.main(MQ3_HashTable.java:7)

1 个答案:

答案 0 :(得分:0)

替换你的代码:

            System.out.println("Current= "+curr.next());
            if(set.contains(curr.next())){

            String current = curr.next();
            System.out.println("Current= " + current);
            if(set.contains(current)) {

以避免在没有检查下一个元素是否可用的情况下调用next()方法。您的if条件也要检查您当前查看的字符串是否在set,而不是下一个。