2011-04-08 9 views
2

나는 두 개의 날짜 필드가있는 클래스는 말을했다 :컬렉션 동시에

class TestData { 
    Date activation; 
    Date timeStamp; 
} 

내가 activation 날짜를 기준으로 위 클래스의 목록을 정렬 할 그들이에 다음 동일한 경우 timestamp 즉 max (활성화) 및 max (시간 스탬프) 기준. 내가 시도

코드는 어떤 도움을 크게 감상 할 수

public class CollectionSort { 

    public static void main(String[] args) { 
     List<TestData> testList = new ArrayList<TestData>(); 

     Collections.sort(testList, new Comparator<TestData>() { 

      @Override 
      public int compare(TestData t1, TestData t2) { 
       int result = 0; 
       if (t1.getActivation().before(t2.getActivation())) { 
         result = 1; 
       } 
       return result; 
      } 
     }); 
     System.out.println("First object is " + testList.get(0)); 
    } 
} 

에만 최대 (활성화)를 가져 follws 같습니다.

감사합니다.

+2

'Comparator' 구현이 음의 정수 (대개'-1')를 반환 할 수 없다면 거의 틀림없이 잘못된 것입니다! 'compare (a, b)'가 양수'int '를 반환하면'compare (b, a)'**는 반드시 음수 값을 반환해야합니다! –

+1

compare 메서드에서 TestData 또는 instanceof 테스트에 대한 캐스트가 필요하지 않습니다. 제네릭 (Java 5) 이후 캐스트가 자동으로 수행되므로 메서드 매개 변수는 이미 TestData 유형입니다. –

답변

9

이렇게하면됩니다.!

 Collections.sort(yourList, new Comparator<TestData>() {  
      public int compare(TestData o1, TestData o2) { 
       int date1Diff = o1.getActivation().compareTo(o2.getActivation()); 
       return date1Diff == 0 ? 
         o1.geTimestamp().compareTo(o2.getTimestamp()) : 
         date1Diff; 
      }    
     }); 
9

다음은 일반 자바에서 그것을 할 방법은 다음과 같습니다

public int compare(TestData o1, TestData o2) { 
    int result = o1.getActivation().compareTo(o2.getActivation())); 
    if(result==0) result = o1.getTimeStamp().compareTo(o2.getTimeStamp()); 
    return result; 
} 

또는 Guava로 (ComparisonChain 사용) :

public int compare(TestData o1, TestData o2) { 
    return ComparisonChain.start() 
     .compare(o1.getActivation(), o2.getActivation()) 
     .compare(o1.getTimeStamp(), o2.getTimeStamp()) 
     .result(); 
} 

또는 Commons/Lang로 (CompareToBuilder 사용) :

public int compare(TestData o1, TestData o2) { 
    return new CompareToBuilder() 
     .append(o1.getActivation(), o2.getActivation()) 
     .append(o1.getTimeStamp(), o2.getTimeStamp()) 
     .toComparison(); 
} 

(세 버전 모두 동일하지만 일반 Java 버전이 가장 장황하기 때문에 오류가 발생하기 쉽습니다. 세 가지 솔루션 모두 o1.getActivation()o1.getTimestamp()은 모두 Comparable을 구현한다고 가정합니다.

+0

+1 API 간의 좋은 비교 : s! – aioobe

+0

좋은 1 개 ....... –