Удаление двойных объектов в списке Java - PullRequest
0 голосов
/ 02 мая 2020

Для экзамена я тренируюсь писать некоторые алгоритмы к финальному экзамену. Одним из них является создание метода reverse (), который удаляет дубликаты в List <>. Проблема в том, что метод void удаляет только один дубль или два. Как я могу изменить метод?

Здесь код файла List. java. Методы removeFromBack (), removeFromFront (), insertAtBack (), insertAtFront (), print (), isEmpty (), классы List и ListNode уже определены в книге Дейтеля Java. Кроме того, весь импорт выполнен:

public void removeDuplicates() {
    ArrayList<T> toCheck = new ArrayList<T>();
    ListNode<T> current = firstNode;
    while (current != null) {
        toCheck.add(current.data);
        current = current.nextNode;
    }
    current = firstNode;
    HashSet<T> toCheck2 = new LinkedHashSet<T>();

    for (T element: toCheck) {
        toCheck2.add(element);
    }

    for (T element: toCheck2) {
        removeFromBack();
        insertAtBack(element);
    }
}

Ответы [ 3 ]

1 голос
/ 02 мая 2020

Вы можете добавить duplicates список и удалить их следующим образом:

    public void removeDuplicates() {
        ArrayList<T> elements = new ArrayList<T>();
        ListNode<T> current = firstNode;
        while (current != null) {
            if(!elements.contains(current.data))
              toCheck.add(current.data);
            else {
               // you have the duplicates, do your logic
            }
            current = current.nextNode;
        }
    }
0 голосов
/ 02 мая 2020

Для duplicates в Списке вы всегда можете использовать Set, чтобы помочь удалить дубликаты:


public List<Integer> removeDuplicates(List<Integer> list) {
    Set<Integer> set = new HashSet<>(list); // remove all duplicates in set
    List<Integer> result = new ArrayList(set.size());
    for (Integer i : list) {
         if (set.contains(i)) {
             result.add(i);
             set.remove(i); // delete, so duplicate item will not be added to result twice
         }
    }

    return result;
}

0 голосов
/ 02 мая 2020

Существуют более быстрые / более эффективные способы в зависимости от ваших потребностей, но этот в принципе всегда должен работать:

public static <T> ArrayList<T> removeDuplicates(ArrayList<T> toCheck) {

    ArrayList<Integer> toRemove = new ArrayList<Integer>();

    for(int i = 0; i < toCheck.size(); i++) {
        T current = toCheck.get(i);

        for(int j = 0; j < toCheck.size(); j++) {
            if(j == i)continue;

            if(toCheck.get(j) == current) {
                toRemove.add(j);
            }
        }
    }

    Collections.sort(toRemove, Collections.reverseOrder());

    for(int i : toRemove) {
        toCheck.remove(i);
    }

    return toCheck;

}
...