-1

我已经搜索过,但找不到特定于我正在寻找的内容。

我有一个从主列表中获得的重复列表。例如:

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.
4

1 回答 1

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);
            }
        }
于 2013-06-28T16:27:27.760 回答