2016-07-03 6 views
0

내 프로젝트에 NewsItem이라는 클래스가 있습니다. 나는 사용자가 원하는대로 두 가지 방법으로 Descending과 Ascending으로 NewsItem의 ArrayList를 정렬하려고한다. 문제는 Comparable 인터페이스를 사용하고 오름차순 또는 내림차순으로 int를 반환하고 다른 하나는 주석 처리됩니다. 오름차순 또는 내림차순으로 정렬 된 목록을 제공하도록 Collections.sort() 메서드에 어떻게 알릴 수 있습니까? 여기 내 코드가있다.오름차순 및 내림차순 정렬에 Comparable Inteface 사용

@Override 
public int compareTo(NewsItem compNews) { 
    int compTime=((NewsItem)compNews).getNewsTime(); 
    /* For Ascending order*/ 
    return this.NewsTime-compTime; 

    /* For Descending order do like this */ 
    //return compTime-this.NewsTime; 
} 

여기 내림차순으로 댓글을 달았습니다. 그 중 하나를 사용할 수 있습니다. 이 클래스에서 정적 조건을 사용하여 이러한 조건 중 하나를 사용할 수 있습니다. 그러나이 클래스를 직렬화하기 때문에이 클래스에서 정적 변수를 사용하지 않았으며 그렇게하지 않았습니다. 어떤 도움을 주셔서 감사합니다.

답변

4

클래스의 자연 순서는 1입니다. 그러나 이것이 귀하의 클래스 목록에 동일한 순서가 있어야 함을 의미하지는 않습니다.

Collections.sort을 사용하여 목록을 정렬 할 때이 정렬 방법으로 클래스를 보는 방법을 변경하는 비교자를 전달할 수도 있습니다.

예 :

Collections.sort(yourList, new Comparator<NewsItem>(){ 
    public void compare(NewsItem o1, NewsItem o2) { 
     return o2.compareTo(o1); 
    } 
}); 

이 메인 클래스에서 구현 방법의 역을 할 수있는 정렬 방법을 지시한다.

Java 8이 Android 용으로 출시되면 더 짧은 Collections.sort(yourList, Comparator.reverseOrder())을 사용할 수 있습니다.

0

previous answer와 완전히 일치하지만 한 가지 더 언급합니다. 그것이 '자연 질서'를 필요로 내가 Comparable를 사용하여 싫어

Integer.compare(int value1, int value2); 

@Override 
public int compareTo(NewsItem compNews) { 
    int compTime= ((NewsItem) compNews).getNewsTime(); 

    return Integer.compare(compTime, this.NewsTime); 
} 
0

compare Int's 위해 당신은 사용할 수 있습니다. 그러나 자연 질서는 무엇입니까? 사서의 경우 기사 번호로 표시됩니다. 나를 위해, 그것은 이름 옆에있다. 당신에게 그것은 창조 시간입니다.
따라서 '자연 질서'는 모호합니다.

그래서 저는 무엇이 필요한지 명시 적으로 말하면서 (CompareByNewsTimeAscending과 CompareByNewsTimeDescending Comparator를 생성하는 것) Comparator을 사용하는 것이 더 좋습니다.

그러나 또한 무엇을 할 수 있는지 단순히 자연을 주문하고 당신이 콜렉션의 요소가 모두 Comparable 인터페이스를 구현함으로써 정렬 할 수 있습니다 자바에서

3

, 또는 비교기 클래스를 구현하여 ... 목록을 역.

비교기 정렬이 default sort order으로 사용되는 Collection 요소에서 Comparable을 구현할 때 Comparable 만 구현하면 두 가지 정렬 순서를 모두 얻을 수 없습니다.

public class AccendingNewsItemComparator implements Comparator<NewsItem> { 
    public int compare(NewsItem a, NewsItem b) { 
     if (a.getNewsTime() < b.getNewsTime()) return -1; 
     if (a.getNewsTime() > b.getNewsTime()) return +1; 
     return 0; 
    } 
} 

public class DescendingNewsItemComparator extends AccendingNewsItemComparator { 
    public int compare(NewsItem a, NewsItem b) { 
     int result = super.compare(a, b); 
     if (result == 0) return 0; 
     return -result; 
    } 
} 

이 두 클래스를 사용하면보다 컬렉션을 정렬 한 수 오름차순 또는 다음과 같이 내림차순 :

List<NewsItem> items = ... // collection to sort 
boolean ascendingSort = .... // this will control sort order 
Collections.sort(items, ascendingSort ? new AccendingNewsItemComparator() : new DescendingNewsItemComparator()); 

은 내가 추천하는 2 개 개의 비교기를 가지고 적절한 하나를 사용하는 것입니다

관련 문제