【发布时间】:2013-09-30 22:26:28
【问题描述】:
那么,你将如何转换
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());
}
}
【问题讨论】:
-
你有多少这样的数字,或者你如何确定这个特定的代码需要“最快最优化”?
-
我正在编写一个分析算法,因为我正在使用一个巨大的数据集(noSQL DB :( ),我们将数据集分成更小的集合,然后转换为内存中的哈希集对于一个特定的问题。我对此进行了分析,它每次都会消耗几分钟,所以我希望有最快的可用选项,不涉及用 C 编写它,或者在 nosql db 中转换数据。我实际上不无法访问数据。
-
查看我提供的答案以获得稍微优化的版本。很难做到这一点,除非可能使用 StreamTokenizer(如果您可以从数据库中获取数据作为流)。