Что более эффективно: использовать removeAll() или использовать следующую технику HashMap для сохранения только измененных записей в ArrayList

У меня есть 2 ArrayLists Aи Bодной и той же структуры данных. C(hashCode() и equals() переопределены). C представляет отчет студента. Два списка имеют одинаковый размер и представляют собой новые записи учащихся и старые записи соответственно (учащиеся одинаковы в обоих списках, порядок может быть другим). Я хочу сохранить только те записи в A, которые были изменены. Таким образом, я делаю:

 A.removeAll(B)

В соответствии с javadocs, это будет брать каждую запись A и сравнивать с каждой записью B, и если они найдут обе равными, она удалит запись из A. Если запись A не найдено равным какой-либо записи в B, и поскольку все студенты в A также находятся в B, это означает, что эта запись A изменилась. Проблема в том, что это легко n-квадратная сложность.

Другой подход может быть:

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

Я думаю, что это может быть менее сложным, чем решение выше. Это правильно?

14
задан Daud 3 April 2012 в 07:27
поделиться