考虑我有三列值如下,
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
答案 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);