Проблема: удаление дубликатов внутри массива строк в алфавитном порядке

#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 хочет провести сравнение без учета регистра