Was ist effizienter : mit removeAll() oder mithilfe der folgenden HashMap Technik zu behalten, nur die geänderten Datensätze in eine ArrayList

Ich habe 2 ArrayLists A und B von der gleichen datastructure C (hashCode() und equals() überschrieben). C repräsentiert einen Studenten-Datensatz. Die beiden Listen sind von der gleichen Größe und stellen neue Schüler-Datensätze und alten bzw. (die Schüler sind die gleichen in beiden Listen, Bestellung könnte anders sein). Ich möchte Euch nur die Datensätze in Eine, die geändert wurden. Als solche, ich weiß :

 A.removeAll(B)

Gemäß den javadocs, diese hätte jeder Datensatz Ein und vergleichen Sie diese mit jedem Datensatz von B, und wenn es feststellt, dass beide gleich, wird Sie den Rekord von A. Wenn ein Datensatz von A ist nicht gleich zu jedem Datensatz in B, und da alle Studenten, die in A sind auch in B, es bedeutet, dass die Aufzeichnung Eines hat sich geändert. Das problem ist, dass es leicht von n quadratische Komplexität.

Kann ein anderer Ansatz sein :

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);
    }
}

Ich denke, das könnte der eine niedrigere Komplexität als die obige Lösung. Ist das richtig ?

  • Vergessen Sie Ihre Leistung, Ihr original-Lösung ist weit mehr lesbar ist. Nur wenn es sich herausstellt, zu einem Engpass kommen, sollten Sie sogar überlegen, die zweite.
InformationsquelleAutor Daud | 2012-04-03
Schreibe einen Kommentar