2017-03-30 6 views
0

공용 클래스 StringComparatorTest {자바 비교기 정렬 다르게

public static void main(String[] args) { 
    String[] a = {"abc9", "abc", "abc123", "ab9"}; 
    String[] b = {"abc9", "abc", "abc123", "ab9"}; 
    String[] c = {"abc9", "abc", "abc123", "ab9"}; 

    System.out.print("a_Origin  : "); 
    printArray(a); 
    System.out.print("c_Origin  : "); 
    printArray(c); 

    System.out.print("a_Default : "); 
    Arrays.sort(a); 
    printArray(a); 

    System.out.print("c_Default : "); 
    Arrays.sort(c); 
    printArray(c); 

    System.out.print("a_Customized1: "); 
    Arrays.sort(a, new StringComparator()); 
    printArray(a); 

    System.out.print("b_Customized1: "); 
    Arrays.sort(b, new StringComparator()); 
    printArray(b); 

    System.out.print("c_Customized2: "); 
    Arrays.sort(c, new StringComparator2()); 
    printArray(c); 
} 

public static void printArray(String[] arr){ 
    for (String str: arr) { 
     System.out.print(str + " "); 
    } 
    System.out.println(); 
} 

은}

공용 클래스 StringComparator는 Comparator를 구현 {

@Override 
public int compare(String s1, String s2) { 
    if(s1.length() == s2.length()){ 
     if(s1.equals(s2)) 
      return 0; 
     else{ 
      for(int i = 0; i < s1.length(); i++){ 
       if(s1.charAt(i) > s2.charAt(i)){ 
        return 1; 
       }else { 
        return -1; 
       } 
      } 
      return 0; 
     } 
    }else if(s1.length() < s2.length()){ 
     return -1; 
    }else{ 
     return 1; 
    } 
} 

}

StringComparator2를 구현

공용 클래스 비교기 {

@Override 
public int compare(String s1, String s2) { 
    if (s1.length() == s2.length()) { 
     for (int i = 0; i < s1.length(); i++) { 
      if (s1.charAt(i) > s2.charAt(i)) { 
       return 1; 
      } else if (s1.charAt(i) < s2.charAt(i)) { 
       return -1; 
      } 
     } 
     return 0; 
    } else if (s1.length() < s2.length()) { 
     return -1; 
    } else { 
     return 1; 
    } 
} 

}

내가 문자열 개체를 정렬하는 비교기를 가지고, 그것은 "StringComparator"를 밝혀 약간의 버그가 있지만 알아낼 수 없습니다.

"StringComparator"는 에서 작동합니다. "Arrays.sort (b, new StringComparator());" 예상대로 출력됩니다. 나는 "StringComparator"을 기준으로 정렬 한 다음 기본 정렬 (다음 단계) 등을 사용할 때

는하지만, 버그가 보여줍니다

"Arrays.sort에 (A) Arrays.sort에 (A, 새로운 StringComparator()) ; "

출력 순서는 동일해야합니다. (배열 a와 b는 동일 함)

누군가 설명 할 수 있습니까? 고마워요 ~

+0

버그라고 생각하기가 어렵습니다 ... –

+0

당신은 compare (Object o1, Object o2)를 오버라이드해야합니다. @Override public int compare (Object o1, Object o2) { return compare ((String) o1, (String) o2); }' – vlaxmi

+0

표준 lexagraphical sorting을 구현하려고합니까? 너는 그렇지 않다. 길이가 같을 때 문자열의 길이로 정렬하고 알파벳 순으로 정렬합니다. – sprinter

답변

0

이 작품 - StringComparator 클래스에서 비교 -

public int compare(String s1, String s2) { 
     if(s1.length() == s2.length()){ 
      if(s1.equals(s2)) 
       return 0; 
      else{ 
       for(int i = 0; i < s1.length(); i++){ 
        if(s1.charAt(i) != s2.charAt(i)) { 
         return s1.charAt(i) - s2.charAt(i); 
        } 
       } 
      } 
     } 
     return s1.length() - s2.length(); 
    } 

기본 정렬 한 다음 사용자 지정 비교기 (a_customized) 먼저 정렬 된 배열에 주어진 결과는에서와 같이 동일

if(s1.charAt(i) > s2.charAt(i)){ 
    return 1; 
}else { 
    return -1; 
} 

s1.charAt 경우 (- (b_customized) 사용자 정의 비교

된 코드의 문제는 여기에있을 것 같다을 사용하여 i) == s2.charAt (i) 또한 -1을 반환했습니다.

+0

고맙습니다. 문제를 발견했습니다. – Patrick

+0

@Patrick 무엇이 문제였습니까? 내 대답이 도움이 되었습니까? – vlaxmi