#java #arraylist #duplicates
#java #arraylist #дубликаты
Вопрос:
Вот моя функция, которая удаляет дубликаты из массива (отсортированных в алфавитном порядке):
public static void removeDuplicate(ArrayList<String> array){
for (int i = 0; i < array.size(); i ) {
if (i 1 < array.size()) {
if (array.get(i).equalsIgnoreCase((array.get(i 1)))) {
array.remove(i 1);
i=0;
}
}
}
}
Но почему-то все еще есть дубликаты, я ищу другой способ удаления дубликатов в массиве, и они точно такие же, как у меня. Так что теперь я очень сильно напрягаюсь. Если вы можете помочь найти решение моей проблемы, я был бы очень признателен. Кстати, вот пример того, что получается, когда я печатаю свой arraylist после нажатия на него функции removeDuplicate(array):
СПОСОБНОСТЬ, ПРИОБРЕТЕННАЯ ВЗРОСЛЫМ, ПОСЛЕ ТОГО, КАК СНОВА ПРОТИВ ВОЗРАСТА ВОЗРАСТ АЛЬБЕРТА ОТЧУЖДАЛ ВСЕХ ПОЧТИ
Комментарии:
1. Если возможно, рассмотрите возможность изменения метода для возврата нового списка<String>, в котором дубликаты удалены, а входной параметр не изменился. (Вызывающий метод может при необходимости переназначить результат.) Если такой подход возможен, то можно использовать потоки с distinct .
2. Почему бы просто не назначить другому списку и не добавлять элемент, если он уже существует? В этом мире коллекций и лямбд кажется странным перебирать список, подобный массиву. Вы можете попробовать это: geeksforgeeks.org /…
3. Я только что использовал вашу функцию, и она работает отлично, в чем проблема? Пример ввода приводит к следующему результату: [A, СПОСОБНОСТЬ, ПРИСВОЕННЫЙ, ПРИОБРЕТЕННЫЙ, ВЗРОСЛЫЙ, ПОСЛЕ, СНОВА, ПРОТИВ, ВОЗРАСТ, АЛЬБЕРТ, ОТЧУЖДЕННЫЙ, ВСЕ, ПОЧТИ]
4. @Rubydesic, хороший улов 🙂 Единственная повторяющаяся запись
AGE
успешно удаляется фрагментом OP, однако сброс индекса до 0 кажется избыточным для отсортированного списка.
Ответ №1:
Существующий метод должен использовать цикл, начинающийся с конца списка:
public static void removeDuplicate(ArrayList<String> array) {
for (int i = array.size() - 1; i > 0; i--) {
if (array.get(i).equalsIgnoreCase((array.get(i - 1)))) {
array.remove(i);
}
}
}
В случае, если входной список частично отсортирован, a Set
может использоваться для отслеживания дубликатов:
public static void removeDuplicate(ArrayList<String> array) {
Set<String> set = new HashSet<>();
for (int i = 0; i < array.size(); i ) {
if (!set.add(array.get(i).toUpperCase())) {
array.remove(i--); // important to decrement the index!
}
}
}
Ответ №2:
Изменение списка во время итерации по нему обычно приводит к откусыванию.
Попробуйте это
public static List<String> removeDuplicate(ArrayList<String> array) {
return array.stream().distinct().collect(Collectors.toList());
}
Комментарии:
1. OP хочет провести сравнение без учета регистра