【发布时间】:2014-05-09 10:27:04
【问题描述】:
我需要遍历两个元素的所有组合:在一个集合 [1,2,3,4] 我想遍历 [(1,2),(1,3),(1,4), (2,3),(2,4),(3,4)]。是否有现成的工具可以这样做?
// Not what I need, works wrong!
for (Object o1 : set) {
for (Object o2 : set) {
if (o1 == o2) continue;
...
}
}
此代码将执行比所需操作多两倍的操作,因为每个对象都将在两个循环中被访问。
为此编写自己的方法是微不足道的,我只是不想发明轮子。我希望在 Guava 或 Collections API 中找到它,但没有找到这样的功能。
【问题讨论】:
-
首先,您应该使用
o1.equals(o2)而不是o1 == o2,除非您实际使用的是原语。 -
@Cedric_Reichenbach 不。那是一个集合,不可能有两个彼此相等的元素。 == 在这里就足够了。
-
您总是需要遍历这两个集合以找到这些组合。即使你得到另一个 api 内部逻辑也会有同样的复杂性。
-
@Susei 它可能会导致人们得到错误的答案,因为您发布的代码的正确输出是
(1, 2) (1, 3) (1, 4) (2, 1) (2, 3) (2, 4) (3, 1) (3, 2) (3, 4) (4, 1) (4, 2) (4, 3)。基本上这个问题有不一致的地方。 -
@Math 是的,这就是为什么在下一句中我解释了为什么该代码不适合我的任务。