25

那么,您将如何进行转换

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

以最快最优化的方式到一个哈希集。

这是一个用户 ID 列表。

更新

我运行了通过测试程序提供的所有答案,其中每个方法被调用 500,000 次以获得更大的 CSV 字符串。该测试连续执行 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 回答
8
Arrays.stream(csv.split(",")).collect(Collectors.toSet());
于 2019-03-12T08:59:12.450 回答
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 网页添加。由于没有足够的声誉,我无法将此作为评论添加到答案中。

不鼓励使用 StringTokenizer。这里的 Java API 网页上提到了它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

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 回答
0

使用较新的 java 版本:

import java.util.Set;
Set<String> hashSet = Set.of(csv.split(","));
于 2021-08-16T16:36:19.440 回答