簡體   English   中英

將逗號分隔的字符串轉換為 HashSet

[英]Convert comma separated string into a 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());
        }
    }
String[] values = csv.split(",");
Set<String> hashSet = new HashSet<String>(Arrays.asList(values));

其他 6 個答案很棒,因為它們是最直接的轉換方式。

但是,由於String.split()涉及Arrays.asListArrays.asList ,而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());
Arrays.stream(csv.split(",")).collect(Collectors.toSet());

你可以試試

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

試試這個:

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

但是要小心,這可能是最簡單的方法,但不一定是最佳方法。

String[] array= csv.split(",");

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

@Kayaman 目前接受的答案很好,但我有一些東西要從 Java API 網頁中添加。 由於沒有足夠的聲譽,我無法將其添加為答案的評論。

不鼓勵使用 StringTokenizer。 它在此處的 Java API 網頁上提到http://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html

StringTokenizer 是一個遺留類,出於兼容性原因保留,但不鼓勵在新代碼中使用它。 建議任何尋求此功能的人改用 String 的 split 方法或 java.util.regex 包。

嘗試,

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

並且還使用

集合實用程序

collectionutils.addall();

試試

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

使用較新的 Java 版本:

import java.util.Set;
Set<String> hashSet = Set.of(csv.split(","));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM