Java:散列一个巨大列表中的每个可能的对

标签 java performance hashmap

我有一个字符串列表,我想从中获取所有可能的对, 例如

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/

相关文章:

java - 使用Redis或其他DB时应在获取之前调用hasKey方法

java - 如何在AsyncTask中启动客户端并连接到服务器?

javascript - iPad 上的 Webkit 动画性能

java - c++和java中map对象的最大大小是多少?

java - 为什么 Java 中的 Map<> 设计为需要两种类型; Map<> 和 HashMap<>?

Java网络?

java - Intellij Idea 可以配置为在发生 JUnit AssertionError 时中断吗?

css - 是 CSS 文本转换 "expensive"

python - 如何加快python函数调用速度

java - 计算 Java 中 Map 中某个键的出现次数