2014-06-25 4 views
0

이것은 바보 같은 질문처럼 보일지 모르지만 클래스의 정렬 가능한 구조 (모든 종류, List 일 수 있음)를 역순으로 정렬하는 가장 좋은 방법에 대해 문의하고 싶습니다.순서를 바꾸는 Comparator를 생성하는 가장 좋은 방법

public class MyClassComparator implements Comparator<MyClass> { 
    @Override 
    public int compare(MyClass o1, MyClass o2) { 
     return (o1.getMyField()).compareTo(o2.getMyField()); 
    } 
} 

이, 물론, 종류 : Comparable를 구현하지 않습니다 MyClass 때문에, Comparable

첫째을 구현하고 내가 그것을 정렬 할 않는 MyClass, 나는 Comparator,이 같은 것을 만들 자연 순서에 따른 MyClass 객체 MyClass.MyField. 하지만 그 반대 순서를 원해.

물론 compare(MyClass o1, MyClass o2) 메서드에서 역순으로 하드 코딩 할 수 있습니다.

if (o1.getMyField()).compareTo(o2.getMyField()) > 0 return -1; 
if (o1.getMyField()).compareTo(o2.getMyField()) < 0 return 1; 
return 0; 

Anoter 대안처럼 뭔가 내가 처음 제안 MyClassComparator의 코드를 떠나, 그리고 MyClassComparator의 인스턴스를 통과하고 역 비교기를 얻을 수 java.util.Collections에서 public static <T> Comparator<T> reverseOrder(Comparator<T> cmp)을 사용하고 있습니다.

그리고 내 생각에 틀린 세 번째 대안은 자연 순서 비교자를 사용하여 내 LinkedList<MyClass>을 정렬하고 마지막부터 처음으로 요소를 가져올 수 있습니다. LinkedList은 이중 연결 목록이므로 완벽하게 처리해야합니다. 문제는 내가 항상 for each 루프 (부전공수)를 사용하는 대신 특정 Iterator을 가져야한다는 것입니다. 물론 처음에는 정렬 가능한 구조를 정렬하고 싶었지만 이중성이 보장되지는 않습니다. 연결된 목록 또는 역순으로 잘 반복 처리하는 항목

자연스러운 순서 인 MyClass 개체를 사용하지 않을 것이라는 점을 (100 % 확신 할 수는 없다) 고려하면 역순으로, 내 역순을 얻는 가장 좋은 방법은 무엇인가? 비교기?

감사합니다.

+2

다음과 같이 할 수 있습니다 : 대신에'o2' 또는'o1'을 비교하십시오.'(o2.getMyField()). compareTo (o1.getMyField())'; 'Collections.reverse'를 사용하거나 명시한대로'Collections.reverseOrder'를 사용하십시오. 콜렉션을 두 번 처리하지 않으므로 가장 효율적이라고 생각합니다. – MadProgrammer

+1

@Blueriver '가장 좋은'방법으로 무엇을 의미하는지 확실하지 않습니다. , 당신이 설명한 솔루션은 모두 소리가납니다 :) 개인적으로, 나는'reverseOrder()'옵션을 성공적으로 사용했고, 가장 깨끗한 것으로 나타났습니다 : 당신은 콤퍼레이터를 만들어 아이템을 오름차순으로 정렬하고, 하나의 우아한 코드 라인과 정반대입니다. – NotSoOldNick

+0

감사합니다. @ NotSoOldNick. "최고"라고 생각하면 가장 깨끗하고 유지하기 쉬우 며 가능한 한 효율적입니다. javadoc에서 "이 메서드는 선형 시간에 실행됩니다."라는 이유로 reverse()를 사용하는 @MadProgrammer는 문제가되지 않습니다. 즉, 소트 콜렉션을 반복 해 그것을 역순으로 소트하는 것을 의미합니다. 처음부터 역순으로 콜렉션을 정렬 할 수 있다면 그렇게 효율적이지 않습니다. o2 대신 o1과 o2를 비교하는 것이 좋습니다. 그 일을 할 것인가? 내가 제안한 것 대신'o2.getMyField(). compareTo (o1.getMyField())'로'Comparator'를 생성합니다. – Blueriver

답변

1

배열을 뒤집을 경우의 오버 헤드를 피하기 위해 비교기를 사용하는 것이 올바른 방법입니다. 비교하는 클래스가 Comparable을 구현하면 비교 순서를 바꿀 수 있습니다. obj2.compareTo(obj1). 시각화하는 방법은 두 객체를 정수로 생각하고 compareTo를 빼기로 생각하는 것입니다.

+0

'MyClass'에'Comparable'이 없지만'MyClass.myField'는'Comparable'을 구현합니다.가장 좋은 방법은'o1.getMyField(). compareTo (o2.getMyField()) '대신'o2.getMyField(). compareTo (o1.getMyField())'를 수행하는'Comparator' 처음에 만들었습니까? – Blueriver

+0

값을 확인하고 변경할 필요가 없으므로 주문을 반전하는 것이 더 간단하고 빠른 솔루션처럼 보입니다. – NickGerleman

+0

알겠습니다. 고마워요! – Blueriver

관련 문제