Слияние двух HashTable с удалением дубликатов в Java - PullRequest
2 голосов
/ 14 декабря 2010

У меня два Hashtables с парой <int,string>.Теперь они оба имеют повторяющиеся значения в каждом из них, и я хочу объединить обе хеш-таблицы, чтобы получить разные значения.Как я могу это сделать!?

спасибо Редактировать # 1 Я читаю содержимое файла из каталога.и хранение этого содержимого в качестве токенов в двух разных хеш-таблицах.Теперь мне нужно объединить их в одну хеш-таблицу, которая выдала бы разные значения обеих таблиц.

Ответы [ 3 ]

6 голосов
/ 14 декабря 2010

Вы можете использовать putAll метод Hashtable для объединения двух хеш-таблиц.Хеш-таблица, переданная в качестве аргумента, будет перезаписывать дубликаты в исходной хеш-таблице.

Я не понял, как две хеш-таблицы могут быть объединены и при этом иметь различных значений.Если вы хотите удалить дублирующиеся элементы из одной хеш-таблицы (и оставить их во второй хеш-таблице), просто сделайте, как предложено в другом ответе, но без добавления неповторяющихся элементов в map2.После этого первая таблица останется неизменной, а вторая - с записями, которых нет в map1.

Другое решение состоит в объединении двух хеш-таблиц с использованием putAll и очистке второй хеш-таблицы:)

1 голос
/ 14 декабря 2010

Полагаю, вы имеете в виду повторяющиеся ключи, а не повторяющиеся значения.Кроме того, поскольку Hashtable является реализацией карты, я предоставлю универсальное решение для карты.

// assuming the maps are of type String / String
for(Map.Entry<String, String> entry : map1.entrySet()){
    if(map2.containsKey(entry.getKey()){
        map2.remove(entry.getKey());
    }else{
        map2.put(entry.getKey(), entry.getValue());
    }
}

Теперь map2 является объединенной версией со всеми удаленными дубликатами


Но если вы хотитеКарта без дубликатов значений , это довольно громоздко для достижения.Возможно, вам следует проверить интерфейс BidiMap в apache commons / collection .Он предоставляет карты, в которых ключи и значения уникальны.


Собственно, вот простой способ удалить дублирующиеся значения:

Collection<String> values1 = map1.values();
Collection<String> values2 = map2.values();
Collection<String> values1Copy = new ArrayList<String>(values1);
Collection<String> values2Copy = new ArrayList<String>(values2);
while(values1.removeAll(values2Copy)){}
while(values2.removeAll(values1Copy)){}

Теперь все дублирующиеся значения удаляются из обеих карт.(Предполагается, что вы хотите полностью удалить дубликаты. Если вы хотите сохранить одну копию, используйте коллекции values1 и values2 в циклах while и не берите копии.)

0 голосов
/ 14 декабря 2010

Оригинальный вопросник утверждал в комментариях, что он имеет в виду значение, а не ключ.Это делает вопрос неполным.Чтобы в двух разных таблицах были повторяющиеся значения, алгоритм генерации ключей должен быть разным.Если это так, то часть информации, которая отсутствует в вопросе, - какой ключ он хочет сохранить?Один из первой хэш-таблицы или второй?

Решение, представленное выше SPFloyd-seanizer, является правильным, но нуждается в небольшом добавлении логики, если он действительно, действительно имеет значения.эта дополнительная логика сообщала бы коду, под каким ключом поместить вещь в объединенной версии.

, если спрашивающий имеет путаницу 'значения' и 'ключа', то его решение находится на месте.

...