Mam 2 ArrayList
s A
i B
tego samego datastructure C
(hashCode() i equals() przesłonięta). C oznacza zapis studenta. Obie listy mają ten sam rozmiar i reprezentują odpowiednio nowe rekordy uczniów i stare (uczniowie są tacy sami na obu listach, kolejność może być inna). Chcę zachować tylko te zapisy w A, które zostały zmienione. Jako takie, robię:Która jest bardziej efektywne: using removeAll() lub stosując następującą technikę HashMap tylko zachować zmienione zapisy w ArrayList
A.removeAll(B)
Jak na Javadocs, byłoby wziąć każdy zapis i porównać z każdego rekordu z B, a jeżeli stwierdzi, oba równe, to będzie usunąć rekord z A. Jeśli nie stwierdzono, że rekord A jest równy dowolnemu rekordowi w B, a ponieważ wszyscy uczniowie w A są również w B, oznacza to, że ten rekord A zmienił się. Problem polega na tym, że łatwo można złożyć n kwadratową złożoność.
Innym rozwiązaniem może być:
Map<C> map = new HashMap<C>();
for (C record : B){
map.add(record.getStudentId(),record);
}
List<C> changedRecords = new ArrayList<C>();
for (C record : A){
if (record.equals(map.get(record.getStudentId())){
changedRecords.add(record);
}
}
myślę, że to może być o mniejszej złożoności niż powyższe rozwiązania. Czy to jest poprawne ?
Zapomnij o wydajności, twoje oryginalne rozwiązanie jest znacznie bardziej czytelne. Tylko jeśli okaże się, że jest to wąskie gardło, jeśli weźmiesz pod uwagę drugi. – artbristol