字符串索引超出范围,找不到类似的内容

时间:2018-10-02 11:46:31

标签: java

我必须找到字符串中最少出现的字符。

package String2;

public class Methods3 {
  static final int chars=256;
  static char least(String str) {
    int[] bro=new int[chars];
    int j;

    //I made the frequency of chars:
    for(j=0 ; j<str.length() ; j++) {
      (bro[str.charAt(j)])++; //made the array
    }
    int min= bro[str.charAt(0)];

    //Tried finding the smallest value:
    for(int x=0 ; x<bro.length ; x++ ) {
        if((bro[str.charAt(x)])<=min) {
            min=(bro[str.charAt(x)]); //finding the smallest number of times 
        }
    }
    return (char) min;
  }

  public static void main(String[] args) {
    String txt="yooooo bbaa ccoo";
    char rez=least(txt);
    System.out.println(rez);
  }
}

5 个答案:

答案 0 :(得分:2)

Java中的字符串不是每个符号一个字节。尝试创建长度为bro的{​​{1}}数组,或使用HashMap代替数组。

Character.MAX_VALUE

使用地图

int[] bro=new int[Character.MAX_VALUE];

答案 1 :(得分:2)

您的代码中的问题位于:

bro[str.charAt(x)])

由于bro数组的长度为256,因此x也在[0,256]的范围内,但是在您的情况下,您正在索引字符串str本身,该字符串的长度不是256。 / p>

另外,您返回的是字符的最小出现次数,而不是字符本身,在这种情况下,您必须从数组中返回键而不是值,在这种情况下,您需要返回x

编辑:您还必须忽略所有根本不出现在字符串中的字符,在这种情况下,即使不出现,该字符也始终为0,并且始终为最小值。

替换:

for(int x = 0; x < bro.length; x++) {
    if ((bro[str.charAt(x)]) <= min) {
        min = (bro[str.charAt(x)]); // finding the smallest number of times 
    }
}
return (char) min;

具有:

for (int x = 0; x < bro.length; x++) {
    if ((bro[x]) <= min && bro[x] > 0) {
        min = x; // finding the smallest number of times 
    }
}
return (char) min;

答案 2 :(得分:1)

我猜您想打印“ y”,并且您的代码在很多方面都被破坏了:

这可以解决此问题:

public class Methods3 {
    static final int chars = Character.MAX_VALUE;   
    static char least(String str) {    
        int[] bro = new int[chars];    
        int j;    
        for (j = 0; j < str.length(); j++) {            
            (bro[str.charAt(j)])++; // made the array
        }
        int min = Character.MAX_VALUE;
        for (int x = 0; x < bro.length; x++) {
            if ((bro[x]) <= min && bro[x] > 0)  {
                min = x; // finding the smallest number of times
            }
        }

        return (char) min;
    }

    public static void main(String[] args) {    
        String txt = "yooooo bbaa ccoo";    
        char rez = least(txt);    
        System.out.println(rez);
    }
}

(已固定,建议使用Character.MAX_VALUE)。这将适用于任何字符串。

请注意,必须使用最大值初始化min才能使算法起作用,因此min = Character.MAX_VALUE。

在使用“ bro [str.charAt(x)]”的地方,必须使用“ bro [x]”。

如果需要一个额外的条件“ bro [x]> 0”来忽略未找到的字符,则为

另外,如果您有两个具有相同计数的字母,它将打印最后一个以最小计数相同的字符串出现在字符串中。

答案 3 :(得分:0)

String txt="yooooo bbaa ccoo";  // string length here

您的字符串长度索引在0 <= x <= str.length -1范围内,而您的for循环范围是0 <= x <= 255

在for循环0 <= x <= 255中,请参见str.charAt(x)

if((bro[str.charAt(x)])<=min)

但是

str.length < 256  // that is the problem

x应该是0 <= x <= str.length -1

答案 4 :(得分:0)

  • 添加方法以返回参数char在字符串中出现的次数
  • 使用字符总数初始化变量minOccurences
  • 创建一个空列表以存储出现次数最少的字符
  • 对于字符串中的每个字符
    • 调用此方法并获取发生次数
    • 如果minOccurences大于当前数字,则将其设置为当前数字,清除minChars并添加字符
    • 如果minOccurences等于当前数字,请添加字符