948 Stimmen

Wie initialisiert man HashSet-Werte durch Konstruktion?

Ich muss eine Set mit Anfangswerten.

Set<String> h = new HashSet<String>();
h.add("a");
h.add("b");

Gibt es eine Möglichkeit, dies in einer einzigen Codezeile zu tun? Es ist zum Beispiel nützlich für ein endgültiges statisches Feld.

3 Stimmen

Für Java 8, Java 9 und Java 10 siehe meine Antwort stackoverflow.com/a/37406054/1216775

2 Stimmen

Die Antwort von Michael Berdyshev ist eigentlich die beste, weil sie die sauberste Art ist, eine abänderbar Set. i_am_zero Answer hat auch eine andere Möglichkeit, ein veränderbares Set zu erstellen, aber es ist ausführlicher/umständlicher [mit Lambda-Streaming]; ansonsten ist i_am_zero Answer die nächstbeste Lösung für die Breite seiner verschiedenen Optionen (über Java-Versionen hinweg).

0 Stimmen

HINWEIS: Einige Antworten lassen den Parameter `new HashSet<T>(int initialCapacity) weg, wenn Sie die Größe der Sammlung bereits kennen, verwenden Sie ihn.

4voto

Amr Mostafa Punkte 21852

Nur ein kleiner Hinweis: Unabhängig davon, welchen der hier genannten Ansätze Sie wählen, ist es eine gute Idee, diesem Muster zu folgen, wenn es sich um eine Voreinstellung handelt, die normalerweise nicht geändert wird (wie eine Voreinstellung in einer Bibliothek, die Sie erstellen):

// Initialize default values with the method you prefer, even in a static block
// It's a good idea to make sure these defaults aren't modifiable
private final static Set<String> DEFAULT_VALUES = Collections.unmodifiableSet(...);
private Set<String> values = DEFAULT_VALUES;

Der Nutzen hängt von der Anzahl der Instanzen ab, die Sie von dieser Klasse erstellen, und davon, wie wahrscheinlich es ist, dass die Standardeinstellungen geändert werden.

Wenn Sie sich für dieses Muster entscheiden, können Sie auch die Methode der Set-Initialisierung wählen, die am lesbarsten ist. Die geringen Effizienzunterschiede zwischen den verschiedenen Methoden spielen wahrscheinlich keine große Rolle, da Sie die Menge nur einmal initialisieren werden.

4voto

egorlitvinenko Punkte 2686

(ugly) Double Brace Initialisierung ohne Nebenwirkungen:

Set<String> a = new HashSet<>(new HashSet<String>() {{
    add("1");
    add("2");
}})

Aber in einigen Fällen, wenn wir erwähnt, dass ist ein guter Geruch, um endgültige Sammlungen unveränderlich zu machen, könnte es wirklich nützlich sein:

final Set<String> a = Collections.unmodifiableSet(new HashSet<String>(){{
    add("1");
    add("2");
}})

3voto

Aaron Digulla Punkte 308693

Etwas umständlich, funktioniert aber ab Java 5:

Set<String> h = new HashSet<String>(Arrays.asList(new String[] {  
    "a", "b"
}))

Verwenden Sie eine Hilfsmethode, um es lesbar zu machen:

Set<String> h = asSet ("a", "b");

public Set<String> asSet(String... values) {
    return new HashSet<String>(java.util.Arrays.asList(values));
}

13 Stimmen

(Sie brauchten nicht die new String[] { )

3voto

rakhi Punkte 242

Verwendung von Java 8 können wir schaffen HashSet als:

Stream.of("A", "B", "C", "D").collect(Collectors.toCollection(HashSet::new));

Und wenn wir eine unveränderbare Menge wollen, können wir eine Utility-Methode wie :

public static <T, A extends Set<T>> Collector<T, A, Set<T>> toImmutableSet(Supplier<A> supplier) {
        return Collector.of(
                supplier,
                Set::add, (left, right) -> {
                    left.addAll(right);
                    return left;
                }, Collections::unmodifiableSet);
    }

Diese Methode kann verwendet werden als:

 Stream.of("A", "B", "C", "D").collect(toImmutableSet(HashSet::new));

1voto

Ups Punkte 13

Kann statischen Block für die Initialisierung verwenden:

private static Set<Integer> codes1=
        new HashSet<Integer>(Arrays.asList(1, 2, 3, 4));

private static Set<Integer> codes2 =
        new HashSet<Integer>(Arrays.asList(5, 6, 7, 8));

private static Set<Integer> h = new HashSet<Integer>();

static{
    h.add(codes1);
    h.add(codes2);
}

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