Tôi có hai bộ sưu tập của cùng một đối tượng, Collection<Foo> oldSet
và Collection<Foo> newSet
. Logic yêu cầu là như sau:Cách tốt nhất để so sánh hai bộ sưu tập trong Java và hành động trên chúng?
- nếu
foo
là trong (*)oldSet
nhưng khôngnewSet
, gọidoRemove(foo)
- else if
foo
không có trongoldSet
nhưng trongnewSet
, gọidoAdd(foo)
- else if
foo
là trong cả hai bộ sưu tập nhưng được sửa đổi, hãy gọidoUpdate(oldFoo, newFoo)
- khác nếu
!foo.activated && foo.startDate >= now
, gọidoStart(foo)
- khác nếu
foo.activated && foo.endDate <= now
, hãy gọidoEnd(foo)
(*) "trong" nghĩa là số nhận dạng duy nhất khớp, không nhất thiết là nội dung.
Dòng điện (di sản) mã không nhiều so sánh để tìm ra removeSet
, addSet
, updateSet
, startSet
và endSet
, và sau đó vòng lặp để hoạt động trên từng hạng mục.
Mã này khá lộn xộn (một phần vì tôi đã loại bỏ một số logic spaghetti) và tôi đang cố gắng tái cấu trúc nó. Một số thông tin nền hơn:
- Theo như tôi biết,
oldSet
vànewSet
đang thực sự hậu thuẫn củaArrayList
- Mỗi bộ chứa ít hơn 100 mặt hàng, nhiều khả năng tối đa hiện tại 20
- Mã này được gọi là thường xuyên (đo bằng triệu/ngày), mặc dù các bộ hiếm khi khác
câu hỏi của tôi:
- Nếu tôi chuyển đổi
oldSet
vànewSet
thànhHashMap<Foo>
(thứ tự không phải là mối quan tâm ở đây), với các ID là khóa, nó sẽ làm cho mã dễ đọc hơn và dễ dàng hơn để so sánh? Mất bao nhiêu thời gian & hiệu năng bộ nhớ bị mất trên chuyển đổi? - Lặp lại hai bộ và thực hiện thao tác thích hợp sẽ hiệu quả hơn và súc tích hơn?
+1 cho thấy một URL thư viện –
rắn là không có sẵn nữa. :( –
http://commons.apache.org/proper/commons-collections/javadocs/api-4.0/index.html –