2011-04-11 5 views
0

Leave 객체 목록이 있으며 leave 속성은 leaveDate (java.util.Date), leaveTime (int), leaveType (String)입니다.). 이제 해당 목록에 속성 leaveDate가 timeStamp와 일치하는 노드가 있는지 확인하려면 timeStamp가 다른 Date 객체이므로 해당 목록을 반복 할 수 있습니다. 그것을 할 다른 방법이 있습니까?객체 목록에 해당 객체의 특정 속성과 일치하는 노드가 있는지 확인하십시오.

if (Lambda.select(this.fullLeaves, Lambda.having(Lambda.on(Leave.class).getLeaveDate(), Matchers.equalTo(timeStamp))).size() == 0) { 
      //some code 
} 

는 그것은 lambdaj를 사용 또한 다음과 같은 조건 검사가 있습니다. 고맙습니다.

답변

1

단순한 반복 및 테스트 속성의 성능을 향상 시키려면 목록의 개체에 대한 보조 인덱스 역할을하는 데이터 구조를 만들고 선택 조건자를 해당 쿼리에 대한 쿼리로 변환해야합니다 색인.

선택 술어의 특성에 따라 가장 적합한 색인 자료 구조가 판별됩니다. 속성 평등을 테스트하는 경우 HashMap이 수행합니다. timestamp 비교 (before, after)를 수행해야한다면 TreeMap이 필요할 것이다.

여기에는 절충안이 있습니다. 보조 색인을 사용하면 목록 검색 속도가 빨라지지만 복잡성이 증가하고 목록 추가 및 제거 속도가 느려집니다. 따라서 평균 목록 크기 및 사용 패턴에 따라 보조 인덱스가 전반적인 성능 향상을 가져올 지 여부가 결정됩니다.


테스트중인 속성을 변경할 경우

은/개체가 목록에있는 동안, 당신은 보조 인덱스에게 입대 객체의 속성이 변경 될 때마다 업데이트 할 필요가 변경 될 수 있습니다. 이를 정확히 구현하면 상당한 추가 비용과 복잡성이 추가됩니다.

1

개체 목록을 검색 할 때 O (n) 시간 동안 개체를 반복하는 것보다 더 잘 수행 할 수 없습니다.

두 가지 다른 옵션이 있습니다,하지만 그들은 다른 데이터 구조를 사용하는 것이 필요 - 중 대신 목록의, 또는에 추가 :

  1. 사용 남기기 객체의 배열, 그리고 정렬 유지 타임 스탬프에 의해. 이 방법을 사용하면 O (log (n)) 시간 내에 올바른 휴가를 검색 할 수 있습니다. 더 높은 삽입 시간으로 지불해야합니다. Leave를 올바른 위치에 삽입하고 필요에 따라 배열 크기를 확장해야하기 때문에 목록에 O (1)에 Leave를 추가 할 수 있습니다.

  2. 지도를 사용하십시오. 여기서 키는 타임 스탬프입니다. 이렇게하면 O (1) 시간에 찾고있는 휴가를 찾을 수 있습니다.

옵션 2는 더 간단하게 구현할 수 있습니다. 어떤 경우이든 데이터 구조를 사용하는 방법에 따라 선택이 달라집니다. 삽입 - 투 - 비율은 무엇입니까? 더 많은 삽입 작업을 수행하면 목록에 머무르는 것이 가장 좋습니다. 더 많은 것을 원한다면지도를 찾으십시오.

또한 일반적인 목록의 크기에 따라 다릅니다. 수백 개의 객체가 있다면, 어느 정도 큰 차이를 느끼지 않을 것입니다.

마지막으로 가장 적합한 방법은 특정 사용 패턴에 따라 다양한 구현을 테스트하는 것입니다.

관련 문제