1

私はしばらくの間、さまざまなことを試してきましたが、なぜ私の論理が間違っているのかわかりません。意味がありません。

次の擬似コードに基づいてプログラムを作成しようとしています。


文字列内の文字をランダムに並べ替える次の疑似コードを Java プログラムに変換します。

  1. 単語を読みます。
  2. ループ word.length() 回を繰り返します
  3. 単語内のランダムな位置 i を選択しますが、最後の位置ではありません。
  4. 単語内のランダムな位置 j > i を選択します。
  5. 位置 j と i の文字を入れ替えます。
  6. 単語を印刷します。
  7. 次に、文字列を次のように置き換えます。first + word.charAt(j) + middle + word.charAt(i) + last

これは私がこれまでに持っているものです:

package assignment4;

import java.util.Scanner;

public class P4Point7 {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        System.out.print("Please enter a word: ");
        String word = in.next();
        in.close();

        int wordLength = word.length(); // Gets the word.Length
        int x = 1; // Primes the loop

        while (x <= wordLength) {
            int i = (int) ((Math.random() * wordLength) - 1); // Gets a random letter i that is not the last letter
            int j = (int) (Math.random() * (wordLength - i)) + i; // Gets a random letter j after i 
            String first = word.substring(0, i); // Gets first part of word
            String middle = word.substring(i + 1, j); // Gets middle part of word
            String last = word.substring(j + 1, wordLength); // Gets last part of word
            x++; // Increments the loop
            String status = first + word.charAt(j) + middle + word.charAt(i) + last; // Swaps i and j in the word
            System.out.println(status);
        }   
    }
}

私が抱えている問題は

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(Unknown Source)
at assignment4.P4Point7.main(P4Point7.java:21)

「ワッフル」という単語でプログラムをテストしています。

4

6 に答える 6

1

いくつかの提案:

オブジェクトを使用しRandomてランダム インデックスを生成すると、インデックスの生成が簡素化される場合があります。Math.random()0.0 から 1.0 の間の double を返します。これに語長を掛けても、0 から語長 - 1 の範囲の乱数が返されるとは限りません。

Random indexGen = new Random();
int i = indexGen.nextInt(wordlength -1);
int j = indexGen.nextInt(wordlength -1 - i) + i;

また、擬似コードを読む方法は、i の文字を j の文字と交換するだけで、これを行うことができるということです。

char[] charArray = yourWord.toCharArray()
char temp = charArray[i];
charArray[i] = charArray[j];
charArray[j] = temp;
String finalWord = new String(charArray);

部分文字列を使用して編集

まず、インデックスが常に正しいようにロジックを修正し、0 <= i < j <= wordlength. それをifステートメントに入れて、インデックスが間違っているかどうかがわかります

if( 0 <= i && i < j && j <=wordlength)
{
     String first = word.substring(0, i);
     String middle = word.substring(i+1, j);
     String last = word.substring(j+1, wordLength);
     //... etc
}
else
     System.out.println("There was an indexing error: i = " + i + ", j = " + j);

インデックス用に編集

int i = (int) ((Math.random() * wordLength) - 1)
if ( i < 0)
    i = 0;

次に、 j についても同じですが、チェックしj > iます。別の代替手段は、そのように使用するMath.abs()ことです

int i = Math.abs((int) ((Math.random() * wordLength) - 1))
于 2013-10-13T23:05:44.143 に答える
1
  i = (int) ((Math.random() * wordLength) - 1); 
  j = (int) (Math.random() * (wordLength - i)) + i; //  

この 2 行では、と に(int) (Math.random() * (wordLength - i))なる場合が0ありi == jます。その場合、次のコード行:

String middle = word.substring(i+1, j); 
          // if i==j, then  i+1 > j which will result in index exception.
  1. デバッガーを使用してコードを段階的にデバッグし、バグを見つけます。
  2. 0 (含む) と指定された値 (含まない) の間のランダムな整数を返す素敵な関数を持つRandomクラスを使用します。random.nextInt(n)
于 2013-10-13T23:17:47.830 に答える
0

あなたの i と j は、文字列サイズの外にある可能性があるようです。ランダムな位置を取得する方法を変更してみてください。

試してみてください:

Random rand = new Random();
int i = rand.nextInt(wordLength - 1); // This will return you a random position between 0 and wordLength -2
int j = rand.nextInt(wordLength - i) + i; // This should give you a position after or equals i.
于 2013-10-13T23:08:39.810 に答える
0

これが解決策でした。

import java.util.Scanner;

public class PermuteCharacters
{
   public static void main(String[] args)
 {
       Scanner in = new Scanner(System.in);

  System.out.println("Enter a word to permute: ");

  String word = in.next();
  for (int n = 0; n < word.length(); n++)
  {
     /** 
        The -1 here guarantees that later we won't pick a j that goes off
        the end of the string. This is important since since the 
        pseudocode tells us to pick a j > i
     */
     int i = (int) (Math.random() * word.length() - 1);
     int j = (int) (Math.random() * (word.length() - i - 1)) + i + 1;

     String first = word.substring(0, i);
     String middle = word.substring(i + 1, j);
     String last = word.substring(j + 1);

     word = first + word.charAt(j) + middle + word.charAt(i) + last;
  }

  System.out.println("Your permuted word is: " + word);
   }
}
于 2013-10-24T15:20:51.953 に答える
0

このコードでうまくいきました:

import java.util.Random;

public class Word
{
   private Random generator = new Random();
   public Word() 
   {
        generator = new Random();
        final long SEED = 42;
        generator.setSeed(SEED);
   }

   public String scramble(String word)
   {     
    int lenWord = word.length();      
    for (int l = 0; l < lenWord; l++)
    {
        int i = generator.nextInt(lenWord - 1);    
        int j = i + 1 + generator.nextInt(lenWord - i - 1);

        String letterI = word.substring(i, i + 1);
        String letterJ = word.substring(j, j + 1);

        String FIRST = word.substring(0, i);
        String MIDDLE = word.substring(i + 1, j);;
        String LAST = word.substring(j + 1, lenWord);

        word = FIRST + letterJ + MIDDLE + letterI + LAST;
    }
    return word;
}
}
于 2016-07-03T14:56:48.890 に答える