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

问题描述 投票:16回答:9

那么,你将如何进行转换

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

以最快最优化的方式使用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());
        }
    }
java csv hashset
9个回答
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());

24
投票
String[] values = csv.split(",");
Set<String> hashSet = new HashSet<String>(Arrays.asList(values));

2
投票

你可以试试

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

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

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

1
投票

试试这个:

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

但要小心,这可能是最简单的方法,但不一定是最优的。


1
投票

@Kayaman目前接受的答案很好,但我还有一些东西需要从Java API网页添加。由于没有足够的声誉,我无法将其添加为对答案的评论。

不鼓励使用StringTokenizer。它在Java API网页上提到http://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html

StringTokenizer is a legacy class that is retained for compatibility reasons although its use is discouraged in new code. It is recommended that anyone seeking this functionality use the split method of String or the java.util.regex package instead.

0
投票

尝试

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

0
投票

尝试,

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

并且还使用

CollectionUtils

collectionutils.addall();

0
投票

Arrays.stream(csv.split( “”))收集(Collectors.toSet())。

© www.soinside.com 2019 - 2024. All rights reserved.