【发布时间】:2013-01-20 06:32:29
【问题描述】:
这段代码需要 9 分钟才能运行一组 5,600 个对象:
public Set<UnDirectedPair<T>> getAllUndirectedPairs(Set<T> setObjects) {
Set<T> setObjectsProcessed = new TreeSet();
Set<UnDirectedPair<T>> setPairs;
setPairs = new TreeSet();
Iterator<T> setObjectsIteratorA = setObjects.iterator();
Iterator<T> setObjectsIteratorB;
T currTA;
T currTB;
while (setObjectsIteratorA.hasNext()) {
currTA = setObjectsIteratorA.next();
setObjectsProcessed.add(currTA);
setObjectsIteratorB = setObjects.iterator();
while (setObjectsIteratorB.hasNext()) {
currTB = setObjectsIteratorB.next();
if (!setObjectsProcessed.contains(currTB) && !currTA.equals(currTB)) {
setPairs.add(new UnDirectedPair(currTA, currTB));
}
}
setObjectsProcessed.add(currTA);
}
return setPairs;
}
正在寻找一种方法来显着减少运行时间...想法?
[背景] 该集合包含人员。集合中有重复项(相同的人,但属性略有不同,因为输入时出现错误)。我有需要 2 人并进行必要更正的方法。因此,作为初步步骤,我需要创建一组 (Person, Person) 对,将其提供给这些方法。
【问题讨论】:
-
你最好在codereview.stackexchange.com上提问
-
你想用那个“双循环”做什么?
-
在一个不相关的注释上:您可以使用 for (T t : setObjects) {} 而不是迭代器。因此,您可以跳过检查 hasNext() 和迭代器的创建。但我猜这不会带来明显的好处,只是可读性。
-
你的方法 BigO(nnn){
setObjectsProcessed.contains(currTB)} 这很糟糕。你能说一下你想要达到的目标吗? -
collection.contains 将占用另一个
O(n)
标签: java loops optimization collections