4

私はJavaの順列について多くの異なる投稿を見てきましたが、どれも私の法案に適合しなかったので、投稿することにしました。

したがって、2つあり、重複のないList<Integer>すべての順列ペアを生成する必要があります。ペアの1つの要素が最初のリストにあり、2番目の要素が2番目のリストにあります。

たとえば、私が持っている場合:

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)

私はすでに(2、3)を持っているので、(3、2)はここにないことに注意してください

遠く離れた場所でも何かをするための図書館が見つかりませんでしguavaた。似たようなものがあることがわかりましたPermutationsが、最近廃止されたようです。

また、リストは非常に大きくなる可能性があるため、メモリに保存する必要はありません。ペアを1つずつ繰り返すだけでよいので、その場でリストを生成する方法を見つけようとしています。実装しようと思っていたのIterable<Pair>ですが、効率的に見えるものは書けないようです。

この種のことをすでに行っているライブラリを知っているなら、それも非常に役立つでしょう!

4

1 に答える 1

5

どうですか

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)]
于 2012-06-01T15:27:13.640 に答える