我一直在看很多关于Java中排列的不同帖子,但是没有一个符合我的账单,所以我决定发帖.
所以我有2 List<Integer>,我需要生成所有排列对,没有重复,其中该对的一个元素在第一个列表中,第二个元素在第二个列表中.
例如,如果我有:
List<Integer> l1 = Arrays.asList(new Integer[] {1, 2, 3});
List<Integer> l1 = Arrays.asList(new Integer[] {2, 3, 4});
Run Code Online (Sandbox Code Playgroud)
然后我想输出:
(1, 2), (1, 3), (1, 4), (2, 2), (2, 3), (2, 4), (3, 3), (3, 4)
Run Code Online (Sandbox Code Playgroud)
注意,(3,2)不在这里,因为我已经有(2,3)
我找不到任何库甚至远程关闭的东西,我发现guava有类似的东西,Permutations但似乎最近已经停止或其他东西.
另外,我想不必存储在内存中的列表,因为它可以是相当大的,我只需要遍历在一个对的时间,所以我试图找到方法来生成它们的飞行.我正在考虑实现一个,Iterable<Pair>但我似乎无法编写任何看起来有效的东西.
如果你知道那些已经做过这种非常有用的东西的图书馆!
怎么样
class Pair {
private int x, y;
Pair(int x, int y) {
this.x = x;
this.y = y;
}
@Override public int hashCode() {
int result = 1;
result = 31 * result + x;
result = 31 * result + y;
return result;
}
@Override public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof Pair)) return false;
Pair tmp = (Pair) obj;
return (tmp.x == x && tmp.y == y) || (tmp.x == y && tmp.y == x);
}
public String toString() {
return "(" + x + "," + y + ")";
}
}
class Testt {
public static void main(String[] args) {
List<Integer> l1 = Arrays.asList( 1, 2, 3 );
List<Integer> l2 = Arrays.asList( 2, 3, 4 );
Set<Pair> set = new HashSet<Pair>();
for (int i : l1)
for (int j : l2)
set.add(new Pair(i, j));
System.out.println(set);
}
}
Run Code Online (Sandbox Code Playgroud)
产量
[(1,2), (1,3), (1,4), (2,2), (2,3), (2,4), (3,3), (3,4)]
Run Code Online (Sandbox Code Playgroud)