【问题标题】:Quickest way to compare a bunch of array or list of values比较一堆数组或值列表的最快方法
【发布时间】:2010-05-13 12:54:45
【问题描述】:

请告诉我比较大量值的最快捷有效的方法。就像有一个父代码(字符串)列表,每个代码都有一系列子值(字符串)。子列表必须相互比较,找出重复项并计算它们重复的次数。

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) 等重复项维护另一个 hashmap,并将初始 hashmap 更改为 codeMap.put(codeValue, codeValue)

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

【问题讨论】:

    标签: java performance arrays comparison


    【解决方案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]     
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-04-21
      • 2011-05-18
      • 2015-07-04
      • 1970-01-01
      • 1970-01-01
      • 2016-09-27
      • 1970-01-01
      • 2018-03-02
      • 1970-01-01
      相关资源
      最近更新 更多