【问题标题】:Generating non duplicate permutation pairs of 2 lists in Java on the fly在 Java 中动态生成 2 个列表的非重复排列对
【发布时间】:2012-06-01 15:09:01
【问题描述】:

我一直在查看很多关于 Java 排列的不同帖子,但没有一个符合我的要求,所以我决定发布。

所以我有 2 个List<Integer>,我需要生成所有 排列对,其中 没有重复,其中一个元素在第一个列表中,第二个第二个列表中的一个。

例如,如果我有:

List<Integer> l1 = Arrays.asList(new Integer[] {1, 2, 3});
List<Integer> l1 = Arrays.asList(new Integer[] {2, 3, 4});

然后我想输出:

(1, 2), (1, 3), (1, 4), (2, 2), (2, 3), (2, 4), (3, 3), (3, 4)

注意 (3, 2) 不在这里,因为我已经有了 (2, 3)

我找不到任何图书馆可以做一些远程关闭的事情,我发现 guavaPermutations 有类似的东西,但它似乎最近已经停产了。

另外,我不想将列表存储在内存中,因为它可能非常大,我只需要一次迭代一对,所以我试图找到生成它们的方法 在飞行中。我正在考虑实现Iterable&lt;Pair&gt;,但我似乎无法编写任何看起来有效的东西。

如果您知道已经在做这类事情的库,那也会很有帮助!

【问题讨论】:

  • 如果不将一些东西存储在内存中以确定哪​​些对已经被看到,我认为这是不可行的。无论如何,您指的是哪种番石榴?我不认为我们已经“停止”了这些方面的任何东西......
  • 我错了,但我认为您的意思是集合,而不是排列。排列关心顺序,因此您可以按不同顺序保存值,并且它们不被认为是等效的。集合不关心顺序,只关心其中的内容。不确定这是否会帮助您找到解决方案,但认为它可能会。

标签: java permutation


【解决方案1】:

怎么样

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)]

【讨论】:

  • 这听起来很不错,谢谢,我没有考虑到集合...只是好奇,你为什么使用LinkedHashSet 而不仅仅是HashSet
  • 应该是HashSet 测试了不同的idea忘记换回来了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-27
  • 2014-03-15
  • 1970-01-01
相关资源
最近更新 更多