2016-11-07 3 views
-2

여기 내 코드의 일부가 for 루프로 정렬 된 문자열 목록을 만들지 만 어떤 이유로 숫자 중 하나에 잘못된 대답을 제공합니다.왜 내 compareTo()가 잘못된 답변을 제공합니까?

public static void main(String[] args) { 
    List<String> answer = new ArrayList(); 
    List<String> n = new ArrayList<>(); 
    int w = 1327; 
    int x = 17; 
    int y = 15; 
    int z = 12; 
    n.add(Integer.toString(x)); 
    n.add(Integer.toString(y)); 
    n.add(Integer.toString(z)); 
    n.add(Integer.toString(w)); 



    while (n.size() > 0) { 

     String smallest = null; 
     for (String f : n) { 
      if (smallest == null || smallest.compareTo(f)>0) { 
       smallest = f; 

      } 
     } 
     answer.add(smallest); 
     n.remove(smallest); 

예상 출력은 다음과 같습니다

12 
15 
17 
1327 
1327 
17 
15 
12 

코드 출력 대신입니다 :

12 
1327 
15 
17 
17 
15 
1327 
12 

그것뿐만 아니라 반대로 인쇄 때문에 코드의 다른 부분이며에 예상되는 이유 그런 식으로. 1327에 잘못된 int를주는 이유 때문에 compareTo (f)> 0을 이미 디버깅했습니다. 누군가 잘못된 일을하는 사람을 알고 있습니까?

+8

당신이 사용할 수있는, 당신의 알고리즘을 작성 방지 할 수 있습니다. 당신은 * 문자열 *을 비교하고 있습니다. "1327"은 "15"보다 이전 문자열입니다. 대신 '목록 '을 만드십시오 ... –

+0

숫자가 아니라 문자열을 정렬합니다 (알파벳 순서). – assylias

+0

그것은 완전히 맞습니다. "1327"< "15" – Li357

답변

2

실제로 프로그램이 제대로 실행됩니다. String.compareTo를 사용하여 정수를 비교합니다 ... 따라서 15 < 12345이지만 '12345'< '15' 정렬하려면 정수를 사용하도록 코드를 조정해야합니다.

PS : 당신은 정수를 비교하지 않을 Collections.sort();

0
List<Integer> answer = new ArrayList(); 
    List<Integer> n = new ArrayList<>(); 
    int w = 1327; 
    int x = 17; 
    int y = 15; 
    int z = 12; 
    n.add(x); 
    n.add(y); 
    n.add(z); 
    n.add(w); 

    while (n.size() > 0) { 

     Integer smallest = null; 
     for (Integer f : n) { 
      if (smallest == null || smallest>f) { 
       smallest = f; 

      } 
     } 
     answer.add(smallest); 
     n.remove(smallest);