25

では、どのように変換しますか

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());
        }
    }
4

10 に答える 10

33
String[] values = csv.split(",");
Set<String> hashSet = new HashSet<String>(Arrays.asList(values));
于 2013-09-25T10:58:50.267 に答える
14

他の 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());
于 2013-09-25T11:23:01.947 に答える
5

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

Set<String> set= new HashSet<String>(Arrays.asList(yourString.split(",")));
于 2013-09-25T11:00:50.180 に答える
3

これを試して:

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

ただし、これはおそらく最も簡単な方法ですが、必ずしも最適な方法ではないことに注意してください。

于 2013-09-25T11:01:00.820 に答える
1
String[] array= csv.split(",");

Set<String> set = new HashSet<String>(Arrays.asList(array));
于 2013-09-25T10:59:58.130 に答える
1

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

StringTokenizer の使用は推奨されません。ここのJava API Webページで言及されていますhttp://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html

StringTokenizer は、新しいコードでの使用は推奨されていませんが、互換性のために保持されているレガシー クラスです。この機能が必要な場合は、代わりに String の split メソッドまたは java.util.regex パッケージを使用することをお勧めします。
于 2015-11-08T18:49:48.000 に答える
0

試す、

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

また、

コレクションユーティリティ

collectionutils.addall();
于 2013-09-25T11:01:15.440 に答える
0

試す

String[] args = csv.split(",");
Set<String> set = new HashSet<String>(Arrays.asList(args));
于 2013-09-25T11:02:41.267 に答える