Java:如何修复“字符串索引超出范围:#”?

时间:2019-03-26 16:32:57

标签: java string methods

我正在尝试对字符串的两个随机字母进行加扰,该字符串不是第一个字母,也不是最后两个字母。编译时出现“字符串索引超出范围”错误。我尝试过讨论许多不同的解决方案,但是似乎没有任何效果。

对于此分配,我们必须使用方法和.charAt命令。我试过为两个随机字符创建变量,然后将它们重新添加到翻转的字符串中,但也无法正常工作。

public static String scramble(String input) {
    int range = input.length() - 3;
    int place = (int)(Math.random() * range);
    String newWord = "";
    newWord = input.substring(0, place);
    newWord = newWord + newWord.charAt(place) + 2;
    newWord = newWord + newWord.charAt(place) + 1;

    return newWord;

我期望一个字符串的输出,其中有两个字符被打乱。例如,“神奇”将是“幻想”或“疯狂”。

4 个答案:

答案 0 :(得分:0)

您这样做:

newWord = input.substring(0, place);

因此newWord中的索引从0place-1
然后,您可以这样做:

newWord.charAt(place);

但是此索引在您的String中不存在。是Out of Bound

请参见the doc

答案 1 :(得分:0)

创建newWord = input.substring(0, place)时,该字符恰好具有place个字符。您无法从中请求charAt(place),最后一个字符位于place-1

如果要交换字符,请将输入转换为char[]并生成随机索引以进行交换。

String input = "Fantastic";

// random constraints
int min = 1;
int max = input.length() - 3;

// random two characters to swap
int from = min + (int) (Math.random() * max);
int to;
do {
    to = min + (int) (Math.random() * max);
} while (to == from); // to and from are different

// swap to and from in chars
char[] chars = input.toCharArray();
char tmp = chars[from];
chars[from] = chars[to];
chars[to] = tmp;
String result = new String(chars);

System.out.println(result); // Ftntasaic

答案 2 :(得分:0)

您可以尝试

  public static String scramble(String input) {
    if(input.length() >3){
        int range = input.length() - 3;
        int place  = 1+   new Random().nextInt(range) ;
        input=input.substring(0, place) +input.charAt(place  + 1)+input.charAt(place) +input.substring( place+2);

    }
    return input;
}

输入:很棒 输出:狂热,致命,狂热

答案 3 :(得分:0)

尝试这样的事情:

public static String scramble(String input) {
    int range = input.length() - 3;
    int place = (int)(Math.random() * range);
    String newWord = input.substring(0, place);
    newWord = newWord + input.charAt(place + 1);
    newWord = newWord + input.charAt(place);
    // if you need the whole input, just 2 characters exchanged, uncomment this next line
    // newWord = newWord + input.substring(place + 2, range);
    return newWord;
}