4 Stimmen

Erzeugen nichtduplizierter Permutationspaare von 2 Listen in Java auf dem Sprung

Ich habe mir viele verschiedene Beiträge über Permutationen in Java angesehen, aber keiner davon hat meine Anforderungen erfüllt, also habe ich beschlossen, einen Beitrag zu verfassen.

Also ich habe 2 List, und ich muss alle Permutationspaare generieren, ohne Duplikate, wobei ein Element des Paares in der ersten Liste und das zweite in der zweiten Liste liegt.

Zum Beispiel, wenn ich Folgendes habe:

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

Dann möchte ich als Ausgabe:

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

Beachten Sie, dass (3, 2) hier nicht auftaucht, da ich bereits (2, 3) habe.

Ich konnte keine Bibliothek finden, die auch nur annähernd etwas Ähnliches tut, ich habe gesehen, dass guava etwas Ähnliches mit Permutations hatte, aber es scheint kürzlich eingestellt worden zu sein oder so.

Außerdem möchte ich die Liste nicht im Speicher speichern müssen, da sie recht groß sein kann, ich muss nur nacheinander durch die Paare iterieren, also versuche ich Wege zu finden, sie on the fly zu generieren. Ich dachte daran, ein Iterable zu implementieren, aber ich kann einfach nichts schreiben, das effizient aussieht.

Wenn Sie Bibliotheken kennen, die bereits solche Dinge tun, wäre das auch sehr hilfreich!

5voto

Pshemo Punkte 118094

Wie wäre es mit

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 l1 = Arrays.asList( 1, 2, 3 );
        List l2 = Arrays.asList( 2, 3, 4 );

        Set set = new HashSet();
        for (int i : l1)
            for (int j : l2)
                set.add(new Pair(i, j));

        System.out.println(set);
    }
}

Ergebnis

[(1,2), (1,3), (1,4), (2,2), (2,3), (2,4), (3,3), (3,4)]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X