那么,你将如何转换
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());
}
}
答案 0 :(得分:24)
String[] values = csv.split(",");
Set<String> hashSet = new HashSet<String>(Arrays.asList(values));
答案 1 :(得分:13)
其他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());
答案 2 :(得分:2)
你可以尝试
Set<String> set= new HashSet<String>(Arrays.asList(yourString.split(",")));
答案 3 :(得分:1)
String[] array= csv.split(",");
Set<String> set = new HashSet<String>(Arrays.asList(array));
答案 4 :(得分:1)
试试这个:
Set<String> hashSet = new HashSet<>(Arrays.asList(csv.split(",")));
但要小心,这可能是最简单的方法,但不一定是最佳方式。
答案 5 :(得分: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包。
答案 6 :(得分:0)
试,
String[] splitValues = csv.split(",");
Set<String> set = new HashSet<String>(Arrays.asList(splitValues));
并使用
collectionutils.addall();
答案 7 :(得分:0)
试
String[] args = csv.split(",");
Set<String> set = new HashSet<String>(Arrays.asList(args));
答案 8 :(得分:0)
Arrays.stream(csv.split(“,”))。collect(Collectors.toSet());