tôi có 2 ArrayList
s A
và B
của cùng một datastructure C
(hashCode() và equals() ghi đè). C đại diện cho hồ sơ của học sinh. Hai danh sách có cùng kích thước và đại diện cho hồ sơ học sinh mới và các bản ghi cũ tương ứng (các sinh viên giống nhau trong cả hai danh sách, thứ tự có thể khác nhau). Tôi chỉ muốn giữ những bản ghi trong A đã được thay đổi. Như vậy, tôi làm:Đó là hiệu quả hơn: sử dụng RemoveAll() hoặc sử dụng kỹ thuật HashMap sau để giữ lại chỉ thay đổi bản ghi trong một ArrayList
A.removeAll(B)
Theo javadocs, điều này sẽ mất mỗi bản ghi của A và so sánh với mỗi bản ghi của B, và nếu nó tìm thấy cả hai bằng nhau, nó sẽ loại bỏ các bản ghi từ A. Nếu một hồ sơ của A không được tìm thấy bằng bất kỳ bản ghi nào trong B, và vì tất cả học sinh trong A cũng ở B, điều đó có nghĩa là bản ghi A đã thay đổi. Vấn đề là nó dễ dàng của n phức tạp vuông.
cách tiếp cận khác có thể là:
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);
}
}
Tôi nghĩ rằng đây có thể là của một phức tạp thấp hơn so với giải pháp trên. Đúng không ?
Quên về hiệu quả, giải pháp ban đầu của bạn dễ đọc hơn nhiều. Chỉ khi nó trở thành một nút cổ chai, bạn thậm chí nên xem xét thứ hai. – artbristol