2012-12-14 2 views
1

나는 이것을 수행하는 쉬운 방법이 있다는 것을 알고있다. 즉, 선택 정렬 및 stringBuilder 클래스를 사용하여 문자열을 정렬하려고하는데, 무한 루프가 발생한다. 누군가가 도울 수 있다면, 감사하겠습니다. 패키지 Chapter9Str; 가져 오기 java.util. *;선택 정렬을 사용하여 문자열 정렬 alg

public class SortedString { 

    public static void main(String[] args) { 
     String input = "cabed"; 

     System.out.println(sort(input)); 
    } 

    public static String sort(String str) {  
     StringBuilder sb = new StringBuilder(str); 

     for(int i=0; i<sb.length()-1; i++) { 
      char tmp; 
      for(int j=i+1; j<sb.length(); j++) { 
       if(sb.charAt(j) < sb.charAt(i)) { 
        tmp = sb.charAt(i); 
        sb.insert(i, sb.charAt(j)); 
        sb.insert(j, tmp); 
       } 
      } 
     } 
     return sb.toString();  

    } 

} 
+0

루프를 돌 때마다 문자열에 두 개의 문자를 삽입하고 있습니다. 의도하는 바가 의심 스럽습니다. 두 개를 제거하거나 대신 교체해야하지 않습니까? – OldCurmudgeon

+0

BTW - 이것은 [선택 정렬]이 아닙니다. (http://en.wikipedia.org/wiki/Selection_sort) 이것은 [버블 정렬]입니다. (http://en.wikipedia.org/wiki/Bubble_sort) – OldCurmudgeon

+0

@OldCurmudgeon No 그렇지 않습니다. 스왑은 필요할 때보 다 자주 칠합니다 (가장 낮은 값은 tmp로 추적 한 다음 내부 루프의 끝에서 바꿀 수 있음). 내부 루프를 통해 정적이고 각 반복의 끝에서 바깥 쪽 루프는 정확히 하나 이상의 값이 가장 작은 것부터 가장 큰 것까지 순서대로 보장됩니다. – femtoRgon

답변

3

스왑 할 때마다 실제로 문자열의 길이가 늘어납니다.

  if(sb.charAt(j) < sb.charAt(i)) { 
       tmp = sb.charAt(i); 
       sb.insert(i, sb.charAt(j)); 
       sb.insert(j, tmp); 
      } 

삽입 문자는 문자를 바꾸지 않고 지정된 위치에 넣습니다. 예를 들어 acbd으로 시작하면 해당 코드 섹션을 클릭 한 후 이 아닌 abccbd으로 남게됩니다.

나는 당신이 찾고있는 것이 setCharAt 방법이라고 생각합니다.

+0

정확히 그게 문제 였어 .... 고마워. – miatech

관련 문제