2017-05-05 5 views
2

필자는 크기가 같지 않은 두 개의 컬렉션 또는 Arraylists를 비교해야합니다. 하나의 컬렉션은 REST 페이로드에서 새로 다운로드 된 객체 컬렉션입니다. 다른 하나는 개체 컬렉션의 로컬 리포지토리에있는 컬렉션입니다. 컬렉션 중 어느 것도 중복 객체를 갖지 않습니다.Java : 새 개체 또는 업데이트 된 개체의 두 컬렉션 비교

로컬 리포지토리에없는 새 개체 또는 다운로드 된 컬렉션에서 업데이트 된 개체를 로컬 리포지토리의 기존 개체에서 찾는 것이 좋습니다.

membershipObject: 
       id 
       start_date 
       end_date 
       uniqueId 

iduniqueId가 이상적 컬렉션의 고유 : 따라서, 클래스는 결국 두 개의 새로운 개체의 컬렉션을 반환하는 방법과 업데이트 된 객체

있을 것이다 객체의

서명 구성 그들을 비교하십시오. start_date은 일반적으로 변경되지 않지만 end_date은 null이거나 datetime 객체가 될 수 있습니다. end_datenull인지 여부에 따라 개체가 "활성"또는 "비활성"인지를 찾는 지원 방법이 있습니다.

그리고 마지막 다운로드 이후에 end_date이 변경되면 개체가 업데이트 된 것으로 간주됩니다.

예 : 위 예에서

downloadedCollection 
    0: 
     id: 1 
     start_date: 2017-05-01 00:00:00 
     end_date: null 
     uniqueId: <unique-string-abc> 
    1: 
     id: 2 
     start_date: 2017-04-01 00:00:00 
     end_date: 2017-05-02 00:00:00 
     uniqueId: <unique-string-cde> 
    2: 
     id: 3 
     start_date: 2017-05-01 10:00:00 
     end_date: null 
     uniqueId: <unique-string-def> 

localCollection 
    0: 
     id: 1 
     start_date: 2017-05-01 00:00:00 
     end_date: null 
     uniqueId: <unique-string-abc> 
    1: 
     id: 2 
     start_date: 2017-04-01 00:00:00 
     end_date: null 
     uniqueId: <unique-string-cde> 

id 2 업데이트 및 id 3downloadedCollection에서 새로운되었다.

작업의 복잡성을 고려하여이 두 컬렉션을 비교하는 가장 이상적인 Java 방법은 무엇입니까? Java SDK 7

+2

일반적으로 변경된 내용을 확인하기 위해 데이터를 비교하지 마십시오. 대신 관리 시스템이 무엇을 볼 것인지 알 수 있도록하기 위해 무엇인가를 변경할 때 "더러운"플래그를 설정합니다. – azurefrog

+2

설명 된대로 작업을 수행해야하는 경우 멤버 객체에 적절한 'hashCode()'메소드를 구현하고 해당하는 equals() 메소드를 구현할 수 있습니다. 그런 다음 새로 다운로드 한 목록의 요소를 포함하는'HashSet'을 만든 다음 참조 목록의 요소를'removeAll()'합니다. 어떤 요소가 남아 있는지는 구성원 목록의 equals() 메소드에 의해 정의 된 의미에서 참조 목록과 다른 것이거나 다른 것입니다. –

+0

@azurefrog 이것은 REST 서비스에서 다운로드되기 때문에 서비스에서 클라이언트의 무엇이 더러운 지 알 수는 없습니다. 클라이언트가 실제로 무엇이 변경되었는지 (서비스의 최신 데이터를 단순히 사용하는 대신) 알아야한다고 가정하면 JohnBollinger의 솔루션은 상당히 좋습니다. –

답변

0

해시 테이블에서 @ local로 사용 가능한 ID (키) 및 만료 정보 (값)를 유지 관리해야합니다. 언제든지 새로운 밸브 루프를 통해 루프를 수신하고 UR 저장소 및 해시 테이블을 업데이트하십시오. O (n),을 실행합니다. 여기서 n은 새 목록의 noof 항목입니다.