繁体   English   中英

比较一堆数组或值列表的最快方法

[英]Quickest way to compare a bunch of array or list of values

您能否以最快最有效的方式让我知道比较大量值的方法。 就像有一个父代码(字符串)列表,每个代码都有一系列子值(字符串)。 子列表必须相互比较,找出重复项并计算重复的次数。

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)

速度才是要求。 希望你们中的一个可以帮助我。

您想使用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]     
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM