2014-02-13 2 views
0

우리에게 할당 된 문제에 대한 코드를 작성했으며 현재 코드가 잘못된 결과를 계속 제공합니다. 질문의 프롬프트는 다음과 같습니다.자바 CompareTo 메서드

여러분 중 일부는 알 수 있듯이 JOHN보다 더 좋은 이름은 없습니다. 이름을 비교하기위한 규칙을 정의합시다. 각 글자에는 체중이 있습니다 ('A'- 1, B - 2, ..., 'Z - 26). 이름의 가중치는 모든 문자의 가중치의 합계입니다. 예를 들어, 이름 MARK의 가중치는 13 + 1 + 18 + 11 = 43입니다. 두 개의 이름을 비교할 때 더 큰 가중치를 가진 것이 더 좋다고 간주됩니다. 동점 일 경우 사전에 사전 식으로 제공되는 것이 좋습니다. 그러나 한 가지 예외가 있습니다. JOHN이라는 이름이 모든 것 중에서 가장 좋은 이름입니다. String [] 이름이 주어지며 각 요소에는 단일 이름이 들어 있습니다. 최상으로부터 최악의 이름을 소트 해, 소트 된 String []를 돌려줍니다.

내가 쓴 코드는 다음과 같습니다 : 나는 대부분의 경우에 점점되어야 하는지를의 반대를 얻을 수있는 것처럼

public class TheBestName { 
     public String[] sort(String[] names) { 
      Arrays.sort(names, new APTComp()); 
      return names; 
     } 

     class APTComp implements Comparator<String>{ 
      public int compare(String a,String b){ 
       String alphabet= "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
       HashMap<Character,Integer> greatMap = new HashMap<Character,Integer>(); 
       for(int i=0;i<alphabet.length();i++){ 
        greatMap.put(alphabet.charAt(i), i+1); 
       } 
       int countA=0; 
       int countB=0; 
       for(int i=0;i<a.length();i++){ 
        int temp= greatMap.get(a.charAt(i)); 
        countA+= temp; 
       } 
       for(int i=0;i<b.length();i++){ 
        int temp=greatMap.get(b.charAt(i)); 
        countB+=temp; 
       } 
       if(a.equals("JOHN") && b.equals("JOHN")){ 
        return 0; 
       } 
       if(a.equals("JOHN") && !b.equals("JOHN")){ 
        return 1; 
       } 
       if(!a.equals("JOHN") && b.equals("JOHN")){ 
        return -1; 
       } 
       else{ 
        int diff= countA-countB; 
        if(diff!=0){ 
         return diff; 
        } 
        if(diff==0){ 
         return a.compareTo(b); 
        } 

       } 
      } 

     } 



    } 

이 나타납니다. compareTo 메서드로 주변을 둘러 보았지만 차이는 없었습니다. 내가 여기서 뭘 잘못하고 있는지 말해 줄 수 있니?

감사합니다, Junaid

+0

내가 * *, 왜'a.compareTo를 돌려 혼란 스러워요 (B)'? 또한 내 [ComparableComparator] (http://www.frischcode.com/2013/11/help-i-have-comparable-but-i-need.html) –

답변

0
여기

나는 그것을 할 것입니다 방법,

 public int compare(String a, String b) { 
     String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
     HashMap<Character, Integer> greatMap = new HashMap<Character, Integer>(); 
     for (int i = 0; i < alphabet.length(); i++) { 
      greatMap.put(alphabet.charAt(i), i + 1); 
     } 
     int countA = 0; 
     int countB = 0; 

     if (a.equals("JOHN")) { 
      countA = Integer.MAX_VALUE; 
     } else { 
      for (int i = 0; i < a.length(); i++) { 
       int temp = greatMap.get(a.charAt(i)); 
       countA += temp; 
      } 
     } 
     if (b.equals("JOHN")) { 
      countB = Integer.MAX_VALUE; 
     } else { 
      for (int i = 0; i < b.length(); i++) { 
       int temp = greatMap.get(b.charAt(i)); 
       countB += temp; 
      } 
     } 

     if (countB == countA) { 
      return a.compareTo(b); 
     } 

     return countB - countA; 

    } 
+0

을 사용해보십시오. 반환 문이 –

+0

이므로 잘되었습니다. 당신 말이 맞아요, else는 무의미합니다. – Camilo

+0

질문이 있습니다. 왜 당신은 카운트 B- 카운트 A를 리턴하고, 카운트 A - 카운트 B가 아닌가? – user2904796