我已经搜索过,但找不到具体到我要找的东西。
我从主列表中获得了重复列表。 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.
答案 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);
}
}