2015-05-14 3 views
3

Я пытаюсь сортировать символы в алфавитном порядке в строке, и когда я запускаю свой код в следующем примере: hello, я получаю: heeeeeeeeeheeeelheeellhee вместо ehllo. Может ли smb предложить мне, что я должен исправить в своем коде? Заранее спасибо!Сортировка символов внутри строки

public static void main(String[] args) 
    { 
     String result = ""; 
     Scanner kbd = new Scanner(System.in); 
     String input = kbd.nextLine(); 

     char[] myArray = input.toCharArray(); 

     for(int i = 0; i < myArray.length; i++) 
      for(int j = 0; j < myArray.length; j++) 
      { 
       if(myArray[i] > myArray[j]) 
       { 
        char temp = myArray[j]; 
        myArray[j] = myArray[i]; 
        myArray[i] = temp; 
        result += myArray[i]; 
       } 
       else 
        result += myArray[i]; 
      } 
     System.out.println(result); 
    } 
+0

Каким должен быть результат? – immibis

+0

'result + = myArray [i];' <- Не нужно. Вместо этого, как только вы закончите сортировку, создайте новую 'String' из' myArray' – MadProgrammer

+0

. Увлекательным способом сделать это было бы поместить все символы в TreeSet, а затем перебрать содержимое. – dnault

ответ

0

На каждой итерации цикла, то добавление символа в i в массиве result, но массив не сортируется еще

цикл будет выполнять n * (n - 1) петли, так, за String из 5 символов, что будет 5 * (5 - 1) (или 20) итераций.

Вместо сортировки массива, а затем создать новый String основанный на его содержании ...

String input = "hello"; 

char[] myArray = input.toCharArray(); 

for (int i = 0; i < myArray.length; i++) { 
    for (int j = 1; j < myArray.length; j++) { 
     if (myArray[i] > myArray[j]) { 
      char temp = myArray[j]; 
      myArray[j] = myArray[i]; 
      myArray[i] = temp; 
     } 
    } 
} 
System.out.println(new String(myArray)); 

Также обратите внимание, что for (int j = 0; j < myArray.length; j++) { неправильно и должно быть for (int j = 1; j < myArray.length; j++) {, в противном случае вы будете сравнивать один и тот же символ в в том же положении, что не то, что вы хотите сделать ...

более «точный» пузырьковой сортировки может выглядеть что-то вроде ...

for (int i = 0; i < (myArray.length - 1); i++) { 
    for (int j = 0; j < myArray.length - i - 1; j++) { 
     if (myArray[j] > myArray[j + 1]) { 
      char swap = myArray[j]; 
      myArray[j] = myArray[j + 1]; 
      myArray[j + 1] = swap; 
     } 
    } 
} 
+0

Я пробовал это, @ MadProgrammer. Но теперь проблема в том, что это не сортировка правильно в алфавитном порядке. Если я «привет», это дает мне «eollh». –

+0

@John Тогда вам нужно посмотреть, как работает ваш вид. Если я не исправляю для внутреннего цикла for, я получаю «ollhe» вместо этого;) – MadProgrammer

1

Почему так сложно?

public String sortByChar(String s) 
{ 
    char[] cs = s.toCharArray(); 
    Arrays.sort(cs); 
    return new String(cs); 
} 
+0

Потому что я не думаю, что это пункт упражнения – MadProgrammer

+0

Упражнение - лучше знать, что Java не вручную реализует какой-то механизм «создания пузырьков». Знание коллекций и их способности - хорошая цель для упражнений, –

0

Вы продолжаете изменять result, как вы идете. Это неверно: result собирает запись символов по мере их изменения, чего вы не хотите.

Вы должны удалить result += ... из вашего кода, и использовать после цикла:

String result = new String(myArray); 
Смежные вопросы