문제

이 코드를 고려하십시오.

import java.util.*;



class jm45 implements Comparator<jm45>
{
   private int x;
   jm45(int input) { x = input; }
   public static void main( String args[] )
   {
      List list = new ArrayList();
      list.add(new jm45(2));
      list.add(new jm45(2));
      Collections.sort(list); //faulty line
   }
   public int compare( jm45 t1 , jm45 t2 )
   {
      return t1.x - t2.x;
   }
}
도움이 되었습니까?

해결책

당신의 수업은 구현됩니다 Comparator<jm45> 대신에 Comparable<jm45>.

Comparator 두 개체를 비교하는 방법을 알고 있습니다 Comparable 다른 사람을 그 자체와 비교하는 방법을 알고 있습니다.

비교기를 통과해야합니다 sort() (두 번째 인수로) 사용하려면 값이 비슷해야합니다.

다음은 다음을 사용하는 버전입니다 Comparable 대신 인터페이스 :

import java.util.*;

class Test implements Comparable<Test>
{
    private int x;

    Test(int input)
    { 
        x = input;
    }

    public static void main(String args[])
    {
        List<Test> list = new ArrayList<Test>();
        list.add(new Test(2));
        list.add(new Test(2));
        Collections.sort(list);
    }

    public int compareTo(Test other)
    {
      return x - other.x;
    }
}

그리고 여기에 사용하는 버전이 있습니다 Comparator 상호 작용:

import java.util.*;

class TestComparator implements Comparator<Test>
{
   public int compare(Test t1, Test t2)
   {
      return t1.getX() - t2.getX();
   }
}

class Test
{
    private int x;

    Test(int input)
    { 
        x = input;
    }

    int getX()
    {
        return x;
    }

    public static void main(String args[])
    {
        List<Test> list = new ArrayList<Test>();
        list.add(new Test(2));
        list.add(new Test(2));
        Collections.sort(list, new TestComparator());
    }
}

아무것도 없습니다 멈추다 클래스 구현 Comparator<T> 그 자체로는하지만 그렇게하는 것은 조금 이상합니다. 예를 들어, 당신은 일반적으로 하나의 문자열을 서로 다른 두 줄을 서로 비교하도록 요청하지 않을 것입니다. 원래 문자열 자체와는 아무런 관련이 없습니다.

다른 팁

Collections.sort Javadoc :

요소의 자연 순서에 따라 지정된 목록을 오름차순 순서로 정렬합니다. 목록의 모든 요소는 비슷한 인터페이스를 구현해야합니다.. 또한 목록의 모든 요소는 있어야합니다 상호 비교할 수 있습니다 (즉, e1.compareto (e2)는 목록에있는 요소 E1 및 E2에 대해 ClassCastException을 던져서는 안됩니다).

클래스는 비교할 수없는 비교기를 구현합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top