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.

0voto

ToxiCore Punkte 159

Dies ist eine elegante Lösung:

public static final <T> Set<T> makeSet(@SuppressWarnings("unchecked") T... o) {
        return new HashSet<T>() {
            private static final long serialVersionUID = -3634958843858172518L;
            {
                for (T x : o)
                   add(x);
            }
        };
}

0 Stimmen

SerialVersionUID ist in jedem Fall eine denkbar schlechte Idee

0voto

Jose Quijada Punkte 411

Das Builder-Muster könnte hier von Nutzen sein. Heute hatte ich das gleiche Problem. wo ich brauchte Set mutating Operationen, um mir eine Referenz des Set-Objekts, so kann ich es an Super-Klasse Konstruktor übergeben, so dass sie auch weiterhin zu den gleichen Satz, indem sie wiederum konstruieren eine neue StringSetBuilder aus dem Set, dass die Kind-Klasse gerade gebaut. Die Builder-Klasse, die ich geschrieben habe, sieht wie folgt aus (in meinem Fall ist es eine statische innere Klasse einer äußeren Klasse, aber es kann auch eine eigene unabhängige Klasse sein):

public interface Builder<T> {
    T build();
}

static class StringSetBuilder implements Builder<Set<String>> {
    private final Set<String> set = new HashSet<>();

    StringSetBuilder add(String pStr) {
        set.add(pStr);
        return this;
    }

    StringSetBuilder addAll(Set<String> pSet) {
        set.addAll(pSet);
        return this;
    }

    @Override
    public Set<String> build() {
        return set;
    }
}

Beachten Sie die addAll() y add() Methoden, die Set-rückgebende Entsprechungen von Set.add() y Set.addAll() . Beachten Sie schließlich die build() Methode, die einen Verweis auf das Set zurückgibt, das der Builder kapselt. Im Folgenden wird veranschaulicht, wie dieser Set-Builder zu verwenden ist:

class SomeChildClass extends ParentClass {
    public SomeChildClass(String pStr) {
        super(new StringSetBuilder().add(pStr).build());
    }
}

class ParentClass {
    public ParentClass(Set<String> pSet) {
        super(new StringSetBuilder().addAll(pSet).add("my own str").build());
    }
}

0voto

Christophe Roussy Punkte 15183

Kombinierte Antwort durch Michael Berdyshev mit Generics und Verwendung des Konstruktors mit initialCapacity, Vergleich mit Arrays.asList Variante:

  import java.util.Collections;
  import java.util.HashSet;
  import java.util.Set;

  @SafeVarargs
  public static <T> Set<T> buildSetModif(final T... values) {
    final Set<T> modifiableSet = new HashSet<T>(values.length);
    Collections.addAll(modifiableSet, values);
    return modifiableSet;
  }

  @SafeVarargs
  public static <T> Set<T> buildSetModifTypeSafe(final T... values) {
    return new HashSet<T>(Arrays.asList(values));
  }

  @SafeVarargs
  public static <T> Set<T> buildeSetUnmodif(final T... values) {
    return Collections.unmodifiableSet(buildSetModifTypeSafe(values));
    // Or use Set.of("a", "b", "c") if you use Java 9
  }
  • Dies ist gut, wenn Sie ein paar Werte für init übergeben, für etwas größeres andere Methoden verwenden
  • Wenn Sie versehentlich Typen mit buildSetModif wird das resultierende T ist ? extends Object was wahrscheinlich nicht das ist, was Sie wollen, kann dies nicht mit dem buildSetModifTypeSafe Variante, was bedeutet, dass buildSetModifTypeSafe(1, 2, "a"); wird nicht kompiliert

0voto

Def_Os Punkte 4950

Sie können auch Folgendes verwenden vavr :

import io.vavr.collection.HashSet;

HashSet.of("a", "b").toJavaSet();

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