web-dev-qa-db-ja.com

コンマ区切りの文字列をHashSetに変換します

だから、どのように変換するのですか?

String csv = "11,00,33,66,44,33,22,00,11";

最も速く最適化された方法でハッシュセットに。

これは、ユーザーIDのリスト用です。

更新

より大きなCSV文字列に対して各メソッドが500,000回呼び出されるテストプログラムを通じて提供されたすべての回答を実行しました。このテストは5回連続して実行され(プログラムの起動が初期メソッドを遅らせた場合)、ミリ秒(ms)で以下を取得しました。

Method One Liner->  6597
Method Split&Iterate->  6090
Method Tokenizer->  4306
------------------------------------------------
Method One Liner->  6321
Method Split&Iterate->  6012
Method Tokenizer->  4227
------------------------------------------------
Method One Liner->  6375
Method Split&Iterate->  5986
Method Tokenizer->  4340
------------------------------------------------
Method One Liner->  6283
Method Split&Iterate->  5974
Method Tokenizer->  4302
------------------------------------------------
Method One Liner->  6343
Method Split&Iterate->  5920
Method Tokenizer->  4227
------------------------------------------------


static void method0_oneLiner() {
        for (int j = 0; j < TEST_TIMES; j++) {
            Set<String> hashSet = new HashSet<String>(Arrays.asList(csv
                    .split(",")));
        }
    }

    // ———————————————————————————————–

    static void method1_splitAndIterate() {

        for (int j = 0; j < TEST_TIMES; j++) {
            String[] values = csv.split(",");
            HashSet<String> hSet = new HashSet<String>(values.length);
            for (int i = 0; i < values.length; i++)
                hSet.add(values[i]);
        }
    }

    static void method2_tokenizer() {

        for (int j = 0; j < TEST_TIMES; j++) {
            HashSet<String> hSet = new HashSet<String>();
            StringTokenizer st = new StringTokenizer(csv, ",");
            while (st.hasMoreTokens())
                hSet.add(st.nextToken());
        }
    }
16

他の6つの答えは、最も簡単な変換方法であるという点で素晴らしいです。

ただし、String.split()には正規表現が関係するため、Arrays.asListは冗長な変換を行っています。この方法でそれを行うと、パフォーマンスが多少向上する場合があります。

編集必要なアイテムの数に関する一般的なアイデアがある場合は、HashSetコンストラクターパラメーターを使用して、不要なサイズ変更/ハッシュを回避します。

HashSet<String> myHashSet = new HashSet(500000);  // Or a more realistic size
StringTokenizer st = new StringTokenizer(csv, ",");
while(st.hasMoreTokens())
   myHashSet.add(st.nextToken());
13
Kayaman
String[] values = csv.split(",");
Set<String> hashSet = new HashSet<String>(Arrays.asList(values));
25
TheKojuEffect

あなたが試すことができます

Set<String> set= new HashSet<String>(Arrays.asList(yourString.split(",")));
2
Suresh Atta
String[] array= csv.split(",");

Set<String> set = new HashSet<String>(Arrays.asList(array));
1
Prabhakaran

@Kayamanによる現在受け入れられている回答は良いですが、Java API Webページから追加するものがあります。十分な評判がなかったため、これをコメントとしてコメントに追加できませんでした。

StringTokenizerの使用は推奨されていません。 Java APIウェブページはこちら http://docs.Oracle.com/javase/7/docs/api/Java/util/StringTokenizer.html

StringTokenizerは、互換性のために保持されているレガシークラスですが、新しいコードでは使用しないでください。この機能を探している人は、代わりにStringのsplitメソッドまたはJava.util.regexパッケージを使用することをお勧めします。
1
SagarG

これを試して:

Set<String> hashSet = new HashSet<>(Arrays.asList(csv.split(",")));

ただし、これが最も簡単な方法かもしれませんが、必ずしも最適とは限りません。

1
aUserHimself

試してみる

String[] args = csv.split(",");
Set<String> set = new HashSet<String>(Arrays.asList(args));
0
sunysen

Arrays.stream(csv.split( "、"))。collect(Collectors.toSet());

0
dripp

試して、

String[] splitValues = csv.split(",");
Set<String> set = new HashSet<String>(Arrays.asList(splitValues));

そしてまた使用する

CollectionUtils

collectionutils.addall();
0
newuser