2010-05-13 35 views
1

您可以让我知道最快和最有效的方法来比较一大组值。它就像有一个父代码列表(字符串),每个代码都有一系列的子值(字符串)。儿童名单必须相互比较,找出重复并计算重复次数。最快速的方法来比较一堆数组或值列表

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)

速度是什么要求。希望你们其中一位能帮助我。

回答

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]  
    } 
}