2013-10-30 4 views
3

두 개의 속성 - id 및 timestamp가있는 Item 클래스가 있습니다. 타임 스탬프에 따라 itemList를 정렬하는 사용자 지정 비교기 클래스가 있습니다.다른 정렬 옵션을 사용하는 Java 사용자 지정 비교기

타임 스탬프 또는 ID별로 정렬을 지정할 수있는 비교기 클래스를 사용하는 방법이 있습니까?

Item 클래스 :

public class Item { 

     private Integer id; 
     private Date timestamp; 

} 

비교기 :

public class ItemComparator implements Comparator<Item>{ 
    @Override 
    public int compare(Item mdi1, Item mdi2) { 

    return mdi1.getTimestamp().compareTo(mdi2.getTimestamp()); 

    } 

} 

분류 코드 :

Collections.sort(itemList, new ItemComparator()); 

내가 너무 ID로 목록을 정렬하기 위해 동일한 비교를 사용할 수 있습니까?

답변

3

몇 가지 수정 사항이 있습니다. 예.

는 사용할 필드 정의 열거 인수 생성자를 추가

public class ItemComparator implements Comparator<Item>{ 
    public enum Field { 
     ID, TIMESTAMP; 
    } 

    private Field field; 

    public ItemComparator(Field field) { 
     this.field = field; 
    } 

가 그런 비교 방법 필드에서 switch가 선택 :

@Override 
public int compare(Item mdi1, Item mdi2) { 
    int comparison = 0; 
    switch(field) { 
    case TIMESTAMP: 
     comparison = mdi1.getTimestamp().compareTo(mdi2.getTimestamp()); 
    case ID: 
     comparison = mdi1.getID() - mdi2.getID(); 
    } 
    return comparison; 
} 
+0

감사합니다. – janenz00

+2

이 방법이 효과적이지만 열거 형을 'Comparator '으로 직접 지정하고 서로 다른 경우에 다른 'Comparator'를 해킹하는 것보다는 다른 경우에 대해 'Comparator'를 사용하는 것이 더 바람직합니다. –

2

같은 비교기를 사용하여 목록을 ID별로 정렬 할 수도 있습니까?

글쎄, 당신은 정렬 할 속성을 말하기 위해 생성자 매개 변수를 가질 수 있습니다. 그러나 개인적으로 나는 그 대신에 다른 클래스를 만들 것입니다. 을 원하는만큼 많이 구현할 수 있습니다.

0

두 개의 개별 비교기를 사용하십시오. 정렬 호출에서 사용할 것을 선택하십시오.

1

당신은 Bean Comparator를 사용할 수 있습니다. 그런 다음 클래스의 모든 속성을 정렬 할 수 있습니다. 속성을 정렬하는 데 사용할 메서드 이름을 지정하기 만하면됩니다. 예 :

BeanComparator byId = new BeanComparator(Item.class, "getId"); 
Collections.sort(items, byId); 

이 비교기는 모든 클래스에서 사용할 수 있습니다.

관련 문제