Chcę poznać różnicę między dwiema listami. I to właśnie robię.

oldList = [1,1,2,2,3,3,4,4]
newList = [1,2,3,5]

List<Integer> add = new ArrayList<>(newList);
List<Integer> remove = new ArrayList<>(oldList);
add.removeAll(oldList);
remove.removeAll(newList);

Wynik, którego chcę

add = [5]
remove = [1,2,3,4,4]

Ale removeAll() usuń wszystkie zduplikowane elementy. Wyniki, które otrzymałem

add = [5]
remove = [4,4]

Jak uzyskać listę add i remove? Dzięki.

0
Mido 2 kwiecień 2020, 19:40

4 odpowiedzi

Najlepsza odpowiedź

Będziesz musiał napisać własny kod. Nie można tego zrobić przy użyciu samych bibliotek Java Collection.

import java.util.ArrayList;

public class MyList<T> extends ArrayList<T>{

    public MyList(){
        super();
    }

    public void specialRemoveAll(T[] list) {
        for (T element : list) {
            remove(element); // This only removes the first entry that matches 'element', not all matches
        }
    }

}
2
SomeGuy 2 kwiecień 2020, 16:54

IMO, jeśli nie zależy Ci na szybkości lub czymkolwiek, najprostszym i najłatwiejszym do zrozumienia rozwiązaniem byłoby dodanie wszystkiego od każdego List do Set, ponieważ Set nie może mieć zduplikowane elementy. Następnie powtórz zestawy i utwórz 2 listy wyników.

  1. Iteruj po oldList i dodaj każdy element do oldSet
  2. Iteruj po nowej liście i dodaj każdy element do newEst
  3. Iterate over oldSet - jeśli element nie znajduje się w newEst, dodaj element, aby usunąć List
  4. Iterate over newSet - jeśli element nie znajduje się w oldSet, dodaj element do addList

To rozwiąże twój problem. To nie jest pojedyncza metoda wbudowana w Javę, musisz to zrobić samodzielnie, ale jest bardzo prosta. Nie jest to najbardziej wydajne, ale łatwe do zrozumienia.

Dodawanie do zestawów usuwa duplikaty. Jeśli nie jest old, ale NIE new, oznacza to, że należy go usunąć. Jeśli jest w new, ale nie w old, oznacza to, że należy go dodać. Prosty.

1
loganrussell48 2 kwiecień 2020, 16:51

Stream.of (oldList, newList) .flatMap (List :: stream) .distinct (). Collect (Collectors.toList ());

0
Augusto 2 kwiecień 2020, 16:51

Najprostszy sposób:

oldList.removeIf(newList::remove);
List<Integer> add = new ArrayList<>(newList);
List<Integer> remove = new ArrayList<>(oldList);
1
Halex 2 kwiecień 2020, 17:06