Эффективная структура данных для обнаружения повторяющихся значений по отношению к другому значению - PullRequest
1 голос
/ 30 ноября 2011

Рассмотрим, у меня есть три столбца значений следующим образом:

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) в (Col-A и Col-B) имеет весь наборзначения (то есть 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>();

Добавление каждой строки в хеш-таблицу и, когда будет найден повторяющийся ключ, увеличить счетчик.На последнем этапе проверьте, равняется ли количество числу различных значений в столбце «Значения».

Но я не могу понять, как выполнить итерацию для каждого значения в значениях, т. Е. 9,8,7,10.Есть ли лучший способ сделать это.

[править] После реализации метода dasblinkenlight в Java:

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.Он никогда не переходит в другую часть, даже если ключ тот же.В Java идентификатор связывается с каждым ключом.Так же он проверяет идентификатор или значения в объекте «ключ».

Итерация 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 Ответ

3 голосов
/ 30 ноября 2011

Вместо 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); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...