wseng Ответов: 1

Удаление дубликатов элементов в arraylist


У меня есть следующий вопрос
Цитата:
Вам дается следующая последовательность чисел,
1, 652 ,5, 15, 385, 4 , 55, 666, 13, 2, 4658, 9, 55, -588, 10, 1083, 17 ,4.
Вы можете удалить дубликаты номеров с помощью только использование For loop и ArrayList .

И это мой выход
Before remove : [-588, 1, 2, 4, 4, 5, 9, 10, 13, 15, 17, 55, 55, 385, 652, 666, 1083, 4658]
[-588, 2, 4, 9, 13, 17, 55, 652, 1083]
Некоторые элементы удаляются.

Редактировать
После того, как я удалю метод сортировки, мой вывод будет выглядеть следующим образом
Before remove : [1, 652, 5, 15, 385, 4, 55, 666, 13, 2, 4658, 9, 55, -588, 10, 1083, 17, 4]
[1, 5, 385, 55, 13, 4658, -588, 1083, 4]


Что я уже пробовал:

public class Ex {
    public static void main(String[] args) {

        ArrayList list = new ArrayList();
        list.add(1);
        list.add(652);
        list.add(5);
        list.add(15);
        list.add(385);
        list.add(4);
        list.add(55);
        list.add(666);
        list.add(13);
        list.add(2);
        list.add(4658);
        list.add(9);
        list.add(55);
        list.add(-588);
        list.add(10);
        list.add(1083);
        list.add(17);
        list.add(4);

        Collections.sort(list);

        System.out.println("Before remove : " + list);

        for (int i = 0; i < list.size(); i++) {
            for (int j = 1; j < list.size(); j++) {
                if (list.get(i) == list.get(j)) {
                    list.remove(j);
                }
            }
        }
        System.out.println(list);
    }
}

Richard MacCutchan

Проблема возникает из-за того, что вы удаляете элементы из списка в цикле, который зависит от list.size. Поэтому всякий раз, когда вы удаляете элемент, количество элементов на единицу меньше, чем ожидает цикл, поэтому вы получите неправильные результаты.

1 Ответов

Рейтинг:
12

CPallini

Вы не можете использовать sort метод, требования не позволяют этого.
С другой стороны, вы можете использовать for утверждение: два вложенных цикла сделали бы трюк.

[Обновление]

Вы должны внимательно прочитать документация[^]: 'Удаляет элемент в указанной позиции в этом списке. Сдвигает все последующие элементы влево (вычитает один из их индексов).'
Итак, после удаления элемента вам придется иметь дело с новыми индексами.
Более того:

  • Внешняя петля должна заканчиваться на (size()-1).
  • Внутренняя петля должна начинаться с (i+1).

Подводя итог, попробуйте:
// ...

System.out.println("Before remove : " + list);

for (int i = 0; i < list.size()-1; ++i)
{
    for (int j = i+1; j < list.size(); ++j)
    {
        if (list.get(i) == list.get(j))
        {
            list.remove(j);
            --j; //deal with shifted indices
        }
    }
}
System.out.println(list);
[/Обновление]


wseng

После того как извлеките sort метод, некоторые элементы все еще удаляются.

CPallini

Ну, покажи нам свой обновленный код.

wseng

сообщение обновлено.

CPallini

И моя тоже.

wseng

спасибо,работай как шарм

CPallini

Добро пожаловать.