修改字符数组中的空字符

时间:2017-04-16 02:02:05

标签: java string

我正在尝试从控制台中获取一定长度的字符串,并将字符串中的空字符设置为星号。

System.out.println("Enter a string of digits.");

        someString = input.next();

        if(someString.matches("\\d{0,9}")) {

            charArr = someString.toCharArray();

            for ( char digit: charArr) {
                if(!Character.isDefined(charArr[digit])){
                    charArr[digit] = '*';
                }
            }

            System.out.printf("Your string is: %s%n", new String(charArr));

此代码抛出数组索引超出范围异常,我不知道为什么。

4 个答案:

答案 0 :(得分:1)

for ( char digit: charArr)会迭代charArr中的每个字符 因此,digit包含来自charArr的字符值。

当您通过撰写charArr来访问charArr[digit]中的元素时,您正在将digit从数据类型char转换为int值。 / p>

例如,您有charArr = new char[]{'a','b','c'} charArr['a']相当于charArr[97],但charArr的长度仅为3。

因此,charArr无法访问其大小超出的元素并抛出ArrayIndexOutOfBoundsException

解决方案:循环遍历数组索引而不是元素。

for(int i = 0; i < charArr.length; i++) {
   // access using charArr[i] instead of charArr[digit]
   ...
}

答案 1 :(得分:0)

此循环语句:

for (char digit: charArr) {

迭代数组中的。值的类型为char,可以是0到65535之间的任何值。但是,此语句

    if (!Character.isDefined(charArr[digit])) {

使用digit作为数组的索引。对于&#34;工作&#34; (即不抛出异常),该值必须在0charArr.length - 1的范围内。显然,对于您正在使用的输入字符串,其中一些值不能作为索引接受(例如value >= charArr.length),然后会发生异常。

但是你不想通过测试value来解决这个问题。无论如何,value的值不是(从语义角度来看)数组索引。 (如果你使用它们就好像它们是索引一样,你最终会错过数组中的某些位置。)

如果要索引数组中的值,请执行以下操作:

 for (int i = 0; i < charArr.length; i++) {

然后使用i作为索引。

即使您已修复此问题,您的代码仍然存在问题......对于某些用例。

如果您的输入使用UTF-8编码(例如),它可能包含大于65535的Unicode代码点(字符),并在Java字符串中编码为两个连续的char值。 (所谓的代理对。)如果您的字符串包含代理项对,则isDefined(char)不是有效的测试。相反,您应该使用isDefined(int)和(更重要的是)迭代字符串中的Unicode代码点,而不是char值。

答案 2 :(得分:0)

我认为您正在混合for块。在您的示例中,您将遍历someString.toCharArray()中的每个字符,因此您无法!Character.isDefined(charArr[digit])因为数字是字符,而不是字符。您不能使用char来获取数组的索引。

如果你纯粹检查一个角色是否是一个空格,你可以简单地做以下之一:

  1. if (digit != ' ')
  2. if (!Character.isWhiteSpace(digit)
  3. if (Character.isDigit(digit))

答案 3 :(得分:0)

认为你可以用:

在一行中完成
newString  = someString.replaceAll("\\s", "*");

&#34; \ S&#34;是空格字符的正则表达式模式。