将逗号分隔的字符串转换为HashSet

Men*_*los 16 java csv hashset

那么,你将如何进行转换

String csv = "11,00,33,66,44,33,22,00,11";
Run Code Online (Sandbox Code Playgroud)

以最快最优化的方式使用hashset.

这是一个用户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());
        }
    }
Run Code Online (Sandbox Code Playgroud)

The*_*ect 26

String[] values = csv.split(",");
Set<String> hashSet = new HashSet<String>(Arrays.asList(values));
Run Code Online (Sandbox Code Playgroud)


Kay*_*man 13

其他6个答案很棒,因为它们是最直接的转换方式.

但是,由于String.split()涉及regexp,并且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());
Run Code Online (Sandbox Code Playgroud)

  • @PietroSaccardi我很感谢您的回答,我不一定会在新代码中开始使用`StringTokenizer`,但是使用正则表达式很慢,这在问题和回答中都很清楚。我怀疑可以使用“扫描仪”来避免遗留和缓慢的方面。 (2认同)

小智 7

Arrays.stream(csv.split(",")).collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)


Sur*_*tta 5

你可以试试

Set<String> set= new HashSet<String>(Arrays.asList(yourString.split(",")));
Run Code Online (Sandbox Code Playgroud)