Как я могу удалить повторяющиеся элементы в индексированном списке? - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть этот метод:

static <E> IndexedList<E> deleteRepeated(IndexedList<E> l)

и ИСПОЛЬЗОВАНИЕ:

IndexedList<E> list = new ArrayIndexedList<E>();

На данный момент код у меня такой, но он не работает

   for (int i = 0; i < l.size(); i++) {
    int repeated = 0;
    if (l.contains(l.get(i))) {
        repeated++;
        if (repeated < 1) {
            list.add(l.get(i));
        }
    }
}
return list;

}

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Java 8: list.stream().distinct().collect(Collectors.toList());

Потоковая документация: https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html

0 голосов
/ 19 сентября 2018

Первое, что нужно отметить, это то, что ваш чек:

    if (l.contains(l.get(i)))

всегда будет возвращать true, поскольку вы проверяете, есть ли в списке элемент, полученный из этого списка.Вместо этого вам нужно проверить, есть ли в новом списке этот элемент.И нет необходимости в переменной repeated.

Вот как это сделать для коротких списков (до 100 элементов):

    for (int i = 0; i < l.size(); i++) {
    if (!list.contains(l.get(i))) {
        list.add(l.get(i));
    }
    return list;

Проблема с использованием вышеупомянутого для большихсписки в том, что это может быть очень медленным.Каждый раз, когда вы проверяете элемент, вы просматриваете список (это то, что list.contains делает внутри).Чтобы сделать это быстрее, используйте HashSet для проверки дубликатов:

    Set<E> uniqueValues = new HashSet<>();
    for (int i = 0; i < l.size(); i++) {
    if (uniqueValues.add(l.get(i))) {
        list.add(l.get(i));
    }
    return list;

Кстати, я предполагаю, что это упражнение в разработке алгоритма.Мы не пишем подобный код в реальном мире, но вместо этого мы используем уже существующие средства, предоставляемые стандартным Java API.

0 голосов
/ 18 сентября 2018

Хотя, возможно, это не самое эффективное решение, я просто создал бы LinkedHashSet, который будет удалять дубликаты (сохраняя первоначальный порядок первых появлений каждого элемента), а затем преобразовывать его обратно вList:

private List<String> removeRepeated(List<String> originalValues) {
    return new ArrayList<>(new LinkedHashSet<>(originalValues));
}
...