2013-01-23 6 views
0

다음을 달성하고 싶습니다. 목록에서 원하는 날짜와 날짜를 선택하고 정렬 할 수 있습니다. collections.sort를 사용하여 목록을 오름차순으로 정렬 한 다음 treeSet을 사용하여 목록에서 요소를 복사하고 중복 제거합니다. 이것은 2 샷 접근 방식입니까? 더 빠른 1 단계 접근법이 있습니까?자바 컬렉션 정렬 및 제거

EDIT:: 

Metadata 
{ 
String name; 
Date sourceDate; 
} 

기본적으로 나는 sourceDate를 기반으로 메타 데이터 개체를 주문하고 그것을 역시 중복 제거하려고합니다.

답변

3

Collections#sort 단계를 건너 뛸 수 있습니다 : TreeSet 중복 항목을 제거하고 항목을 정렬합니다. 그래서 기본적으로는 한 줄 작업입니다 : 날짜가 개체의 필드 인 경우

Set<Date> sortedWithoutDupes = new TreeSet<Date> (yourList); 

, 다음 중 하나를 수행 할 수 있습니다 :

  • 는 개체가 Comparable를 구현하고 그 날짜를 기준으로 개체를 비교해야
  • 또는 두 경우 모두 일

하여 객체를 정렬합니다 TreeSet의 생성자에 인수와 같은 Comparator<YourObject>을 통과, 당신은 사전 정렬 할 필요가 없습니다 요 ur 목록.

중요 참고 :

TreeSet의 키를 비교하는 compareTo를 사용합니다. 따라서 두 키의 날짜는 같지만 이름이 다른 경우 compare 또는 compareTo 메서드가 0이 아닌 값을 반환하도록해야합니다. 그렇지 않으면 2 개의 개체가 동일하게 간주되어 하나만 삽입됩니다.

편집

(당신이 널 (null)을 처리해야 + 테스트하지) 코드는 다음과 같을 수 있습니다 :

Comparator<Metadata> comparator = new Comparator<Metadata>() { 
    @Override 
    public int compare(Metadata o1, Metadata o2) { 
     if (o1.sourceDate.equals(o2.sourceDate)) { 
      return o1.name.compareTo(o2.name); 
     } else { 
      return o1.sourceDate.compareTo(o2.sourceDate); 
     } 
    } 
}; 

Set<Metadata> sortedWithoutDupes = new TreeSet<Metadata> (comparator); 
sortedWithoutDupes.addAll(yourList); 
+0

하지만 날짜가 내 개체의 필드 인 경우 어떻게해야합니까? 그런 다음 날짜를 오름차순으로 주문할 수 있습니까? – Phoenix

+0

@Phoenix 약간 다르지만 여전히 작동합니다. 제 편집을 참조하십시오. – assylias

0

TreeSet의 자동 정렬 요소, 당신은을 정렬 할 필요가 없습니다 있도록 목록에 추가하기 전에 목록에 추가하십시오.

+0

그러나 treeset 생성자는 중복 제거 또는 순서 중 하나만 허용하며 둘 다 허용하지 않습니다. 기존 목록의 요소를 복사해야하므로 한 단계에서 어떻게해야합니까? – Phoenix

+0

항상 중복 제거 설정, 복제본을 포함하는 것은 불가능합니다. 최소한 인터페이스의 요구 사항입니다. 그들은 모든 생성자 또는 추가 작업으로 자동으로이를 수행합니다. –