在Java中动态生成2个列表的非重复排列对

在Java中动态生成2个列表的非重复排列对,java,permutation,Java,Permutation,我一直在看很多关于Java中排列的帖子,但是没有一篇符合我的要求,所以我决定发表 因此,我有2个列表,我需要生成所有排列对,其中一个元素在第一个列表中,第二个元素在第二个列表中 例如,如果我有: List<Integer> l1 = Arrays.asList(new Integer[] {1, 2, 3}); List<Integer> l1 = Arrays.asList(new Integer[] {2, 3, 4}); 注意,(3,2)不在这里,因为我已经有了(

我一直在看很多关于Java中排列的帖子,但是没有一篇符合我的要求,所以我决定发表

因此,我有2个
列表
,我需要生成所有排列对,其中一个元素在第一个列表中,第二个元素在第二个列表中

例如,如果我有:

List<Integer> l1 = Arrays.asList(new Integer[] {1, 2, 3});
List<Integer> l1 = Arrays.asList(new Integer[] {2, 3, 4});
注意,(3,2)不在这里,因为我已经有了(2,3)

我找不到任何一个库来做任何事情,哪怕是稍微靠近一点,我发现
guava
有一些类似于
Permutations
的东西,但它似乎最近已经停止使用了

另外,我不想将列表存储在内存中,因为它可能相当大,我只需要一次迭代一对,所以我正在尝试找到方法动态生成它们。我想实现一个
Iterable
,但我似乎无法写出任何看起来有效的东西

如果你知道图书馆已经在做这类事情,那也会很有帮助

怎么样

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);
    }
}

我认为如果不在内存中存储一些东西来确定哪些配对已经被看到,这是不可行的。无论如何,你指的是哪种番石榴?我不认为我们已经“停止”了这方面的任何事情……我可能错了,但我认为你指的是集合,而不是排列。排列关注顺序,因此您可以按不同的顺序保存值,而它们并不被认为是等价的。集合不关心顺序,只关心其中的内容。不确定这是否能帮你找到解决方案,但我认为可能。这听起来很不错,谢谢,我没有从集合的角度考虑。。。只是好奇,为什么你使用
LinkedHashSet
而不仅仅是
HashSet
?它应该是
HashSet
,在测试了不同的想法后,我忘了把它换回来。
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);
    }
}
[(1,2), (1,3), (1,4), (2,2), (2,3), (2,4), (3,3), (3,4)]