2013-03-06 3 views
7

두 개의 비교기, 즉 1 차 및 2 차 비교기가 있습니다. 먼저 기본 비교기에 의해 배열을 정렬 한 다음 보조 배열로 배열을 정렬 할 수 있습니까?두 개의 비교기가있는 배열을 정렬 하시겠습니까?

각 개체에는 이름과 숫자 필드가 있습니다.

Bob 1 
Bob 2 
Jack 1 
Jack 2 

처럼

는 새로운 비교기를 작성하지 않고 할 수 있습니까?

답변

7

예, 새로운 c를 만들지 않고 정렬 할 수 있습니다. omparator.

기본 입력란, 보조 입력란, 제 3 입력란 등으로 정렬하기 위해 well-known trick이 있습니다. 가장 중요하지 않은 입력란 (제 3), 다음 중요한 입력란 (보조 입력란) 및 마지막으로 가장 중요한 입력란 (기본 입력란) . 그러나 이것이 작동하려면 정렬 알고리즘이 안정적이어야합니다..

배열을 정렬하려면 Arrays.sort()을 사용하십시오. List을 정렬하는 경우 Collections.sort()을 사용하십시오. 이 두 가지 방법 모두 안정적입니다.

기본 비교 개체가 변수 primaryComp에 저장되어 있고 보조 개체가 secondaryComp 인 것으로 가정합니다. 다음은 원하는 것을 이루기위한 코드입니다.

Arrays.sort(mylist, secondaryComp); // This must come first! 
Arrays.sort(mylist, primaryComp); 
+0

Nice. 나는 그 트릭에 대해 몰랐다! – Jack

-1

두 번째 비교기를 먼저 비교 한 다음 첫 번째 비교기를 비교하십시오. 나는 그 트릭을해야한다고 생각합니다. 클래스를 만들어 이렇게 할 수 있습니다.

class FullName { 
    public String firstName; 
    public String secondName; 
} 

는, BobBobbins라는 새로운 이름을 만들어 값을 할당 한 후 간단한 첫 번째 이름을 비교 한 다음 이름 말해봐. 당신은 비교 할 수있는 정적 기능을 가질 수 있습니다

public static bool compareTo (FullName name1, FullName name2) { 
    // Algorithm here 
} 

는 정적 비교기를 사용해야을, 당신이해야 할 것입니다 수 있습니다 : 클래스를 가정 FullName.compareTo(BobBobbins, CharlieChaplin);

6

은 다음

class X { 
    String name; 
    int num; 
} 

입니다 정렬은

Arrays.sort(x, new Comparator<X>() { 
     @Override 
     public int compare(X o1, X o2) { 
      if (o1.name.equals(o2.name)) { 
       return Integer.compare(o1.num, o2.num); 
      } 
      return o1.name.compareTo(o2.name); 
     }}); 
관련 문제