3

以下のコードは、文字列を取り、(ランダムに生成された) 2 つの文字の位置を stringLength() 回切り替える必要があります。

ただし、出力が 2 桁増えたり、2 桁減ったりすることがあります。乱数の取得方法の変更から部分文字列の管理まで、あらゆる種類のことを試しましたが、それでもこれらの異常が発生します。

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 for Everyone からのものですが、具体的には宿題ではありません。

アイデアをありがとう

4

2 に答える 2

3

このsubstringメソッドは、下位のインデックスで包括的です。その結果、入れ替えた文字を 2 回含めることになります。1 回は個別に追加するとき、もう 1 回は と の先頭に追加しmiddleますlast

これらの文字列の文字を含むことを避けるために、文字列middlelast部分文字列をそれぞれのインデックスで開始する必要があります。+1ij


変更する直前に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);

Thomas W がコメントで指摘したようにStringIndexOutOfBoundsError、ループは上部と下部の両方で含まれているため、この修正を行うと a に遭遇することにもなります。これを完全に修正する前に、何らかの方法で (ループの開始時または終了時に) 解決する必要があります。

于 2013-09-24T23:57:27.703 に答える
2

Collections.shuffle(List<?> list)順列に使えます。こちらのドキュメントを参照してください。

String str = "abcdefgh";
Character[] chArr = ArrayUtils.toObject(str.toCharArray());
Collections.shuffle(Arrays.asList(chArr));
System.out.println(ArrayUtils.toString(chArr));
于 2013-09-25T00:04:29.857 に答える