您能告诉我有关比较大量值的最快捷有效的方法吗?它就像有一个父代码列表(字符串),每个代码都有一系列子值(字符串)。必须将子列表相互比较,找出重复项并计算它们重复的次数。
code1(code1_value1, code1_value2, code3_value3, ..., code1_valueN);
code2(code2_value1, code1_value2, code2_value3, ..., code2_valueN);
code3(code2_value1, code3_value2, code3_value3, ..., code3_valueN);
.
.
.
codeN(codeN_value1, codeN_value2, codeN_value3, ..., codeN_valueN);
列表很大,比如有100个父代码,每个代码大约有250个值。代码列表中不会有重复项。在java中完成它,我能想出的解决方案是。
codeMap.put(codeValue, duplicateCount)
。计数初始化为0。这样做的结果是获得重复。需要在非常大的列表上执行另一次迭代。
另一种方法是为duplicateCodeMap.put(codeValue, duplicateCount)
等重复项维护另一个散列映射,并将初始散列映射更改为codeMap.put(codeValue, codeValue)
。
速度是要求。希望你们中的一个能帮助我。
答案 0 :(得分:1)
您想使用Map<String,Set<String>>
,例如对于每个子代码,具有它的父代码集是什么。
也就是说,你想要一个Multimap,基本上可以从Guava获得。
以下是一个说明这个想法的示例:
import java.util.*;
public class MultiMap {
public static void main(String[] args) {
String[] codes = {
"A=1,2,3,4",
"B=1,3,5,9",
"C=2,5,7,8",
};
Map<String,Set<String>> map = new HashMap<String,Set<String>>();
Set<String> dupes = new HashSet<String>();
for (String code : codes) {
String parent = code.split("=")[0];
for (String child : code.split("=")[1].split(",")) {
Set<String> set = map.get(child);
if (set == null) {
map.put(child, set = new HashSet<String>());
} else {
dupes.add(child);
}
set.add(parent);
}
}
System.out.println(map);
// {3=[A, B], 2=[A, C], 1=[A, B], 7=[C], 5=[B, C], 4=[A], 9=[B], 8=[C]}
for (String child : dupes) {
System.out.println(child + "=" + map.get(child));
}
// 3=[A, B]
// 2=[A, C]
// 1=[A, B]
// 5=[B, C]
}
}