2011-11-30 79 views
1

考虑我具有的值的三列如下检测重复的值,高效的数据结构,用于对另一值

Col-A   Col-B   Values 
1    2    9 
3    4    9 
5    6    9 
1    2    8 
5    6    8 
3    4    7 
1    2    7 
5    6    10 
1    2    10 
1    3    10 
1    4    10 

因此,在上面的一组值,(1,2) -B)具有所有的值(即9,8,7和10),而其他的则如3,4; 5,6没有所有的价值。我只想获得(1,2)以上数据。

我想过使用哈希表来尝试它,将(ColA,ColB)添加到一个单独的对象,并使用一个Hashtable,其关键是对象和值是列'值'。即

Class K 
{ 
    int a; 
    int b; 
} 

Hashtable<K,int> numbers = new Hashtable<K,int>(); 

将每一行添加到散列表,并且当发现重复键时,增加计数。最后检查计数是否等于“值”列中不同值的数量。

但我无法弄清楚如何迭代值的每个值,即9,8,7,10。有一个更好的方法吗。

[编辑]在Java中实现dasblinkenlight的方法后:

ArrayList<Double> list; 
Hashtable<K,ArrayList<Double>> numbers = new Hashtable<K,ArrayList<Double>>(); 

while((line = brMyHashval.readLine()) != null) 
{ 
    if(!(line.isEmpty())) 
    { 
     String[] temp; 
     temp = line.split(" ");  
     eDouble = Double.parseDouble(temp[5].toString());     
     Val key = new Val(Double.parseDouble(temp[0].toString()) ,Double.parseDouble(temp[1].toString())); 

     if(!(numbers.containsKey(key))) 
     { 
      list = new ArrayList<Double>(); 
      numbers.put(key, list); 

     } 
     else 
     { 
      list = numbers.get(key); 
     } 
     list.add(eDouble); 
    } 
} 

但控制而来的 '如果' 循环每次。即使密钥是相同的,它也不会进入其他部分。在Java中,id与每个关键字相关联。那么它会检查对象'key'中的id或值。

迭代1:键(id = 52)X = 1,Y = 2

迭代2:键(id = 53)X = 3,Y = 4

迭代3:键(id = 55)X = 5,Y = 6

迭代4:键(id = 56)X = 1,Y = 2

回答

3

相反int的,需要存储的值的列表:Hashtable<K,List<int>>添加值,而不是递增计数,如下所示:

var key = new K(a,b); 
List<int> list; 
if (!hashtable.ContainsKey(key)) { 
    list = new List<int>(); 
    hashtable.Add(key, list); 
} else { 
    list = hashtable[key]; 
} 
list.Add(value); 
+0

只是一个说明,原来的问题被标记为java,而不是javascript。虽然如果你把你的答案翻译成Java(这不难),但这当然很有用。 – QuantumMechanic

+0

谢谢。但是每次控制都转到'if'循环。即使密钥是相同的,它也不会进入其他部分。在Java中,id与每个关键字相关联。那么它会检查对象'key'中的id或值。 迭代1: 键(id = 52) X = 1,Y = 2 迭代2: 键(id = 53) X = 3,Y = 4 迭代3: 键(id = 55) X = 5,Y = 6 迭代4: 键(id = 56) X = 1,Y = 2 – SyncMaster

+0

我对面此来了,http://stackoverflow.com/questions/6485186/if - 键式的散列表 - 是 - 一类对象,如何此结果的containsKey工作 – SyncMaster