.asSet(…)はAPIに存在しますか?


108

セットを作成する非常に簡単な方法を探しています。

Arrays.asList("a", "b" ...) 作成します List<String>

同様のものはありSetますか?



1
そうではありません。セットを作成して配列をセットに変換することは同じではありません
cahen

回答:


84

Java 8では、サードパーティのフレームワークを必要とせずにこれを行うことができます。

Set<String> set = Stream.of("a","b","c").collect(Collectors.toSet());

コレクターを参照してください。

楽しい!


4
最近のJava 8では、サードパーティのライブラリに依存せず、他のコレクションタイプに簡単に適応できるため、これがおそらく最良の答えです。これを受け入れたものとして設定します。他の優れたソリューションを提供してくれた皆さんに感謝します。(ところで、このセットは変更可能です)
cahen

3
さて、Javaは冗長すぎると誰が言ったのでしょうか。もちろんこれが一番の答えです!
BobDoolittle 2017年

@BobDoolittleに感謝します!
アンダーソン氏

2
Javaの9+を使用して、誰のためにも、以下のホリーの回答を参照してください。stackoverflow.com/a/48025159/229743を
テイラー

1
アンダーソン氏の完璧な答え!
gaurav

63

Guavaを使用すると、それはそれと同じくらい簡単です:

Set<String> mySet = ImmutableSet.<String> of("a", "b");

または、可変セットの場合:

Set<String> mySet = Sets.newHashSet("a", "b")

その他のデータタイプについては、Guavaユーザーガイドを参照してください


これの不変バージョンはありますか?
cahen

3
@cahenはい:Sets.newHashSet("a", "b")またはSets.newLinkedHashSet("a", "b")
Sean Patrick Floyd

1
答えに可変バリアントを追加しました。
MichaelSchmeißer2013年

実際にSets.newLinkedHashSet()は、その署名では存在しません。申し訳ありません
ショーンパトリックフロイド

タイプ引数の1つを削除できました:Set<String> mySet = ImmutableSet.of("a", "b");
joshden

54

あなたは使うことができます

new HashSet<String>(Arrays.asList("a","b"));

24

メンバーが0個または1個のセットの特殊なケースでは、以下を使用できます。

java.util.Collections.EMPTY_SET

そして:

java.util.Collections.singleton("A")

これらの特殊なケースでは、標準のjava.util APIを使用しているため、おそらく最良のソリューションです
arcuri82

2
java.util.Collections.emptySet()タイプセーフのため、私の考えでは、EMPTY_SETよりも優先されます。コレクションクラスのコメント:Unlike the like-named field, this method is parameterized.
Eddified

17

他の人が言ったように、使用します:

new HashSet<String>(Arrays.asList("a","b"));

これがJavaに存在しない理由Arrays.asListは、固定サイズのリストを返すためです。つまり、

public static void main(String a[])
{
  List<String> myList = Arrays.asList("a", "b");
  myList.add("c");
}

戻り値:

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(Unknown Source)
    at java.util.AbstractList.add(Unknown Source)

クラスSet内に「固定サイズ」のJDK実装はありませんArrays。なぜこれが欲しいのですか?Set保証はまったく重複がないことが、あなたは手でそれらを入力している場合は、その機能を必要とする...とはならないList多くの方法があります。両方のインターフェイスが拡張さCollectionIterableます。


他の人が言ったように、本当にこの機能が必要な場合はguavaを使用してください-JDKにはないので。詳細については、回答(特にMichaelSchmeißerの回答)を参照してください。


3
これは、これまでのところ最良の答えです。これは、Arrays.asList()が実際に行うことを示しているためです。多くの開発者は、Arrays.asList()がjava.util.ArrayListを作成すると信じているようですが、実際にはjava.util.Arrays $ ArrayList(これは部分的にのみ変更可能で、基になる配列のライブビューです)
Sean Patrick Floyd

1
誰かがこれを行う理由について、手動でSet(またはList)を作成する最も一般的な理由は、テスト値を渡すテストクラスにあります。
スコットマッキンタイア

14

Java 9では、同様の機能がファクトリメソッドを介して追加されています。

Set<String> oneLinerSet = Set.of("a", "b", ...);

(同等のListものもあります。)


私はこれを試してみたところ、これがAPIメソッドではないというコンパイラ警告が出ました。
フィリップジョセフィ

関連するJavaドキュメントは次のとおりです。docs.oracle.com / javase / 9 / docs / api/ java/ util / Set.html。Java 9+ JDKを使用するだけでなく、Java 9コンプライアンスを使用するようにIDEまたはビルドツールを調整する必要がある場合があります(たとえば、mavenの場合、ここと同じ手順ですが、1.9に設定します:stackoverflow.com/質問/ 16798066 /…
ホリーカミンズ

Java 9を使用したいのですが。私たちは過去に生きています。:(
jDub9

それは良いですが、引数のサイズにいくつかの制限があります...
Radoslav Ivanov



2

ここにあなたが使用できる小さな方法があります

  /**
   * Utility method analogous to {@link java.util.Arrays#asList(Object[])}
   *
   * @param ts
   * @param <T>
   * @return the set of all the parameters given.
   */
  @SafeVarargs
  @SuppressWarnings("varargs")
  public static <T> Set<T> asSet(T... ts) {
    return new HashSet<>(Arrays.asList(ts));
  }

1

Java 8と列挙型を使用してそれを行う別の方法は次のとおりです。

Set<String> set = EnumSet.of(StandardOpenOption.CREATE, StandardOpenOption.READ);

EnumSetを参照してください。

このアプローチと

Set<String> set = Stream.of(StandardOpenOption.CREATE, StandardOpenOption.READ).collect(Collectors.toSet());

5つを超える要素がある場合、メソッドのjavadocは、Set.Of(E、E ...)の javadocで確認できるように、パフォーマンスの問題である可能性があると述べています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.