2013-09-24 6 views
3

Приведенный ниже код должен взять строку и переключить места из двух символов (произвольно сгенерированных) строкLength() раз.Случайная перестановка символов Java

Однако иногда я получаю две цифры больше или две цифры меньше на выходе. Я пробовал всевозможные вещи от изменения, как я получаю randoms для управления подстроками, и я все еще получаю эти аномалии.

Scanner in = new Scanner(System.in); 
String word = in.next(); 
for (int wordLength = word.length(); wordLength >= 0; wordLength--){ 
    int i = (int) (Math.random() * (wordLength - 1)); 
    int j = 0; 
    // j has to be bigger than i. 
    while (j < i){ 
     j = (int) ((Math.random() * wordLength)); 
    } 
    String first = word.substring(0, i); 
    String middle = word.substring(i, j); 
    String last = word.substring(j); 
    word = first + word.charAt(j) + middle + word.charAt(i) + last; 
    System.out.println(word); 
} 

Вопрос от Java для всех, но это НЕ ОБЯЗАТЕЛЬНО домашняя работа.

Спасибо за ваши идеи

+0

Из вопроса, который вы написали, почему бы не упростить свой код, создав два случайных индекса и заменив символы в этих индексах на str.length() раз? – hrv

ответ

3

substring метод включительно на нижнем индексе. В результате вы включаете свои измененные символы дважды: один раз, когда вы добавляете их по отдельности и один раз в начале middle и last.

Вы должны начать свой middle и last подстроки соответствующих индексов +1, чтобы избежать включения персонажей в i и j в этих строках.


Вы можете увидеть, что я говорю о том, если вы поставите несколько print линии прямо перед вы измените word (чтобы увидеть, что вы собираетесь делать). Вы сможете увидеть из этих распечаток, что вы собираетесь повторять некоторые символы.

System.out.println(String.format("i: %s, j: %s", i, j)); 
System.out.println("first: "+first); 
System.out.println("char i: "+word.charAt(i)); 
System.out.println("middle: "+middle); 
System.out.println("char j: "+word.charAt(j)); 
System.out.println("last: "+last); 

Как Томас W отметил в комментарии, вы также собираетесь работать в StringIndexOutOfBoundsError, когда вы делаете это исправить, потому что ваш цикл включительно и сверху в нижней части. Вам нужно будет разрешить этот способ или другой (либо в начале, либо в конце цикла), прежде чем он будет полностью исправлен.

+2

Существует также ошибка границ внешнего цикла 'wordLength' - она ​​включена как на верхних, так и на конечных границах. На последней итерации 'wordLength - 1' будет -1. Не то, что нужно. –

+0

Да, сменив код на 'String middle = word.substring (i + 1, j); \t \t \t String last = word.substring (j + 1); 'дал правильный результат. Однако я начал получать строку String Index Of Bounds Error. – borg123

+0

@ThomasW Да, абсолютно правильно. Спасибо вам обоим. – borg123

2

Вы можете использовать Collections.shuffle(List<?> list) для перестановки. См. Документы here.

String str = "abcdefgh"; 
Character[] chArr = ArrayUtils.toObject(str.toCharArray()); 
Collections.shuffle(Arrays.asList(chArr)); 
System.out.println(ArrayUtils.toString(chArr)); 
+0

Я предполагаю, что будет использовать Apache Commons Lang для ArrayUtils? – demongolem

+0

Да, от Apache Commons Lang. – Alex

Смежные вопросы