이것은 바보 같은 질문처럼 보일지 모르지만 클래스의 정렬 가능한 구조 (모든 종류, 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 % 확신 할 수는 없다) 고려하면 역순으로, 내 역순을 얻는 가장 좋은 방법은 무엇인가? 비교기?
감사합니다.
다음과 같이 할 수 있습니다 : 대신에'o2' 또는'o1'을 비교하십시오.'(o2.getMyField()). compareTo (o1.getMyField())'; 'Collections.reverse'를 사용하거나 명시한대로'Collections.reverseOrder'를 사용하십시오. 콜렉션을 두 번 처리하지 않으므로 가장 효율적이라고 생각합니다. – MadProgrammer
@Blueriver '가장 좋은'방법으로 무엇을 의미하는지 확실하지 않습니다. , 당신이 설명한 솔루션은 모두 소리가납니다 :) 개인적으로, 나는'reverseOrder()'옵션을 성공적으로 사용했고, 가장 깨끗한 것으로 나타났습니다 : 당신은 콤퍼레이터를 만들어 아이템을 오름차순으로 정렬하고, 하나의 우아한 코드 라인과 정반대입니다. – NotSoOldNick
감사합니다. @ NotSoOldNick. "최고"라고 생각하면 가장 깨끗하고 유지하기 쉬우 며 가능한 한 효율적입니다. javadoc에서 "이 메서드는 선형 시간에 실행됩니다."라는 이유로 reverse()를 사용하는 @MadProgrammer는 문제가되지 않습니다. 즉, 소트 콜렉션을 반복 해 그것을 역순으로 소트하는 것을 의미합니다. 처음부터 역순으로 콜렉션을 정렬 할 수 있다면 그렇게 효율적이지 않습니다. o2 대신 o1과 o2를 비교하는 것이 좋습니다. 그 일을 할 것인가? 내가 제안한 것 대신'o2.getMyField(). compareTo (o1.getMyField())'로'Comparator'를 생성합니다. – Blueriver