У меня есть список объектов Tweet (доморощенный класс), и я хочу, чтобы удалить ОКОЛО дубликатов на основе их текст, используя расстояние Левенштейн. Я уже удалял идентичные дубликаты, хешируя тексты твитов, но теперь хочу удалить тексты, которые идентичны, но имеют до 2-3 разных символов. Поскольку это подход O (n^2), я должен проверить каждый текст твита со всеми доступными другими. Вот мой код до сих пор:ява - Удалить почти дубликаты из списка
int distance;
for(Tweet tweet : this.tweets) {
distance = 0;
Iterator<Tweet> iter = this.tweets.iterator();
while(iter.hasNext()) {
Tweet currentTweet = iter.next();
distance = Levenshtein.distance(tweet.getText(), currentTweet.getText());
if(distance < 3 && (tweet.getID() != currentTweet.getID())) {
iter.remove();
}
}
}
Первая проблема заключается в том, что код бросает ConcurrentModificationException в какой-то момент и никогда не завершается. Второй: могу ли я сделать что-нибудь лучше, чем этот двойной цикл? Список твитов содержит около 400 000 твитов, поэтому мы говорим о 160 миллиардах итераций!
«Вы уже удалили одинаковые дубликаты путем хэширования текстов твитов». Что теперь? 'a.hashCode() == b.hashCode()' ** не подразумевает ** 'a.equals (b) == true'! Верно только противоположное значение. И это должно быть верно для ** любого хеширования, поскольку переменное пространство для хэша должно быть меньше, чем пространство переменных исходного значения (или вы можете просто использовать _it_ как хэш). –
Вы удаляете объекты из списка, который вы зацикливаете во внешнем для каждого. Это не разрешено. – Manu
@BoristheSpider Я не использовал функцию hashCode() для объектов твита, но для текстов. Таким образом, твиты разных людей, которые имеют идентичные тексты твитов, были удалены. На самом деле, из 1M твитов изначально, теперь у меня 390K. – Lefteris008