(я бы поставил ниже в комментарии, но у меня еще нет представителя.)
Что в конечном итоге вы пытаетесь сделать? Найти все дубликаты? Как вы определяете дубликаты? Чувствительность к регистру имеет значение? Аналогичная формулировка?
Я немного озадачен тем, как вы поступаете по этому поводу - находите похожие записи и создаете набор, но затем O (n ^ 2) проверяет то, что я предполагаю, является точным равенством. Если вы проверяете точное равенство, то это, похоже, лишает цели поиска похожих записей (если только вы не используете это в качестве фильтра для вашего O (n ^ 2), чтобы сэкономить время.
Несколько случайных мыслей:
Проведите каждую запись через своего рода дезинфицирующее средство, которое пытается преобразовать каждую запись в наиболее общую форму (если вам важно / это имеет значение).
Если вас интересует точное равенство, и память не является ограничением, но вы ищете скорость, вы можете просто создать объект Java для каждой записи. Определите .equals () для каждой записи (вы всегда можете настроить ее так, чтобы не было точного равенства). Затем вам нужно будет определить hashCode () для этого объекта. Затем вы можете вставить каждую запись в HashSet.
Полученный HashSet не будет иметь дубликатов (как определено вашей реализацией .equals () / .hashCode ()).
Или, если вы хотите найти дубликаты, то перед тем, как добавить в HashSet, проверьте, содержит ли он запись, а если нет, то вы нашли дубликат.
Эта реализация будет очень быстрой, но потенциально может использовать много памяти, поскольку вы будете хранить весь набор данных в памяти. Альтернативой этому может быть создание хеша для каждой записи, а затем сохранение его в HashSet и проверка хешей для каждой записи на равенство.
Недостатком создания хэша для каждой записи является проблема разработки хорошего поколения хэшей с хорошим распределением И, конечно, с хэшами вы должны беспокоиться о ложных срабатываниях при столкновениях. Но если ваш алгоритм хэширования является надежным, то вероятность столкновения должна быть настолько малой, что вам не стоит об этом беспокоиться.
Некоторые мысли о хешах, которые вы могли бы сделать, являются чем-то таким же простым, как MD5 конкатенации всех полей. Вы могли бы сделать контрольную сумму. Или вы можете взять сумму хэш-кода для каждого поля. Я не гений супер математики, поэтому я не могу сказать вам, какое поведение будет наилучшим при распределении и, следовательно, приведет к наименьшей вероятности столкновения. Возможно, стоит попробовать, если вы решите пойти по этому пути.