2 Stimmen

Idiom zur Erstellung einzigartiger Paare von Elementen einer Sammlung in Java

Gibt es ein Standard-Idiom, um eine Menge jedes einzigartigen Paars von Elementen in einer gegebenen Sammlung zu erhalten?

Für unsere Zwecke ist die Menge von (a,b) gleichwertig mit (b,a) und daher sollte nur eines im resultierenden Satz erscheinen.

Ich kann mir vorstellen, wie man eine solche Menge mit einer Pair-Klasse erstellen könnte, die hashCode und equals() basierend auf den gepaarten Elementen implementiert, aber ich frage mich, ob es nicht bereits einen standardmäßigeren Weg gibt, eine solche Menge zu generieren.

2voto

Sheldon Warkentin Punkte 1626

Wie Sie sagten, würde eine Pair-Klasse mit hashcode & equals implementiert und in einem HashSet platziert das erreichen, wonach Sie suchen. Mir ist keine JDK-Datenstruktur bekannt, die dies nativ macht.

Wenn Sie es etwas verallgemeinern möchten, könnten Sie ein Tuple erstellen, Tuple und ein HashSet basierend auf diesem Tuple deklarieren, HashSet>. Erstellen Sie dann eine allgemeinere Equals/Hashcode-Methode für die Tupeltypen.

Hier ist eine Beispielimplementierung:

final class Pair {
    private final A _first;
    private final B _second;

    public Pair(A first, B second) {
        _first = first;
        _second = second;
    }

    @Override
    public int hashCode() {
        int hashFirst = _first != null ? _first.hashCode() : 0;
        int hashSecond = _second != null ? _second.hashCode() : 0;
        return (hashFirst + hashSecond) * hashSecond + hashFirst;
    }

    @Override
    @SuppressWarnings("unchecked")
    public boolean equals(Object other) {
        if (other instanceof Pair) {
            Pair otherPair = (Pair) other;
            return this._first == otherPair._first //
                    || (this._first != null //
                            && otherPair._first != null && this._first.equals(otherPair._first)) //

                    && this._second == otherPair._second //
                    || (this._second != null //
                            && otherPair._second != null && this._second.equals(otherPair._second));
        }
        return false;
    }

    @Override
    public String toString() {
        return "(" + _first + ", " + _second + ")"; 
    }

    public A getFirst() {
        return _first;
    }

    public B getSecond() {
        return _second;
    }

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