比较两个列表&打印在第二个列表中重复的元素

时间:2013-06-28 15:52:52

标签: java

我已经搜索过,但找不到具体到我要找的东西。

我从主列表中获得了重复列表。 E.G。:

duplicateSet { D16A, D2243A, D2235A} 

xConnectors { D16A, xxx, xxxx, xxxx, D16A, xxxx , D2243A ,xxxx, D2243A, xxxx, D2235A, xxxx, xxxx, D2235A}

我写了这段代码

Set duplicateConnectors = new HashSet();
                for(String s : duplicateSet)
                {       
                    for(IXConnector xCon : xConnectors)
                    {
                        if(s.equals(xCon.getAttribute("Name")))
                        {
                            duplicateConnectors.add(xCon);
                            vReporter.report(getDefaultSeverity(), "Connector {0} is duplicate", xCon);

                        }
                    }
                }

我得到的o / p是

Connector D16A is duplicate
Connector D16A is duplicate
Connector D2243A is duplicate
Connector D2243A is duplicate 

但是我需要在一行中使用上述o / p。

Connectors D16A and D16A are duplicates.
Connectors D2243A and D2243A are duplicates.

1 个答案:

答案 0 :(得分:1)

您当前的代码以二次时间运行,即O(n ^ 2),这不是一个非常可扩展的解决方案,因为随着您的输入增加,您的运行时间将以二次方式增长。

你应该在这里利用哈希集,哈希集是一个不允许重复的集合,并且项目被散列到索引数组中,因此你可以获得插入和包含的恒定时间性能。您现在有一个循环来检查之前是否在哈希集中找到连接器名称,如果它是重复的,则此检查也是常量时间。所以你的整个算法都变成了线性的。

 Set<String> dupes = new HashSet<String>();
        for(String s : duplicateSet)
            dupes.add(s);

        for(IXConnector xCon : xConnectors)
        {
            String name = xCon.getAttribute("Name");
            if(dupes.contains(name))
                vReporter.report(getDefaultSeverity(), "Connectors {0} and {0} are duplicates.", xCon);
        }

如果只想打印一次消息,可以将HashSet更改为HashMap,并使用布尔值作为值来表示您是否已经打印了消息。

Map<String, Boolean> dupes = new HashMap<String, Boolean>();
        for(String s : duplicateSet)
            dupes.put(s, false);

        for(IXConnector xCon : xConnectors)
        {
            String name = xCon.getAttribute("Name");
            if(dupes.containsKey(name) && dupes.get(name) == false)
            {
                vReporter.report(getDefaultSeverity(), "Connectors {0} and {0} are duplicates.", xCon);
                dupes.put(name, true);
            }
        }