用于检测针对另一个值的重复值的高效数据结构

时间:2011-11-30 03:40:10

标签: java data-structures

考虑我有三列值如下,

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

因此,在上述值集中,(Col-A和Col-B)中的(1,2)具有所有值集(即9,8,7和10),而其他值如3,4; 5,6没有所有的值。我想用上面的数据只获得(1,2)

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

Class K
{
    int a;
    int b;
}

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

将每一行添加到哈希表中,并且当找到重复的键时,递增计数。 Atlast检查计数是否等于“值”列中的不同值的数量。

但我无法弄清楚如何迭代值中的每个值,即9,8,7,10。有没有更好的方法来做到这一点。

[edit]在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); 
     }
}

但是控件每次都进入'if'循环。即使Key是相同的,它也永远不会进入else部分。在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

1 个答案:

答案 0 :(得分: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);