我有一个字符串列表,我想从中获取所有可能的对, 例如
items_List = [ "A","B","C","D" ]
这些对将是
A-B
A-C
A-D
B-C
B-D
C-D
我想获取所有这些对并将它们放入
HashMap<String, Double>
这样“A-B”将是一个字符串,而 Double 将是我将在单独的函数中计算的某个数字。 我正在做的是
for(int i=0; i< itemsList.length-1;i++){
for(int j = i+1;j<itemsList.length;j++){
a = itemsList[i];
b = itemsList[j];
Double w = compute_w(a,b);
if(w>0) map.put(a+'-'+b, w);
}
问题是我的 itemsList 长度约为 n=400k 项,因此(n 选择 2)个需要在 max 上进行散列的对数(在很多情况下 w 可能为 0),尽管如此对的数量很大,计算所有对需要很长时间(注意:compute_w(a,b) 是一个简单的函数,所以不需要那么多时间就能完成)。 所以我的问题是,有什么办法可以更有效、更快地做到这一点吗? 我尝试将 hashmap 初始长度设置为 Integer.Max,将因子设置为 1.0,但这仍然没有帮助。
如有任何建议,我们将不胜感激。
最佳答案
尝试将查找结构拆分为多个映射
Map<String, Map<String, Double>> map = new HashMap<>(550000);
for (int i = 0; i < itemsList.length - 1; i++) {
String a = itemsList[i];
Map<String, Double> m = new HashMap<>();
map.put(a, m);
for (int j = i + 1; j < itemsList.length; j++) {
String b = itemsList[j];
double w = compute_w(a, b);
if (w > 0) m.put(b, w);
}
}
关于Java:散列一个巨大列表中的每个可能的对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21519149/