【问题标题】:Stringbuilder java字符串生成器 java
【发布时间】:2014-09-18 21:38:57
【问题描述】:

我正在尝试存储一个字符串并确定它是大写/小写字母还是数字,如果字符是小写字母,则以大写字母重新显示字符,如果字符是大写字母,则重新显示小写字符 如果字符是数字,则将其显示为星号。我可以用数字来实现,但如果我为程序不断循环的字母包含 .toString().toLowerCase() 或 .toUpperCase() 。我该怎么办?

public class CharacterArray {
    public static void main(String[] args) {
        StringBuilder input = new StringBuilder("800 Test St NY");
        for (int i = 0; i < input.length(); i++) {
            System.out.println(input.charAt(i));

            if(Character.isDigit(input.charAt(i))){
                input.replace(i,i+1,"*");
            }
            else if(Character.isUpperCase(input.charAt(i))) {
                input.replace(i, i+1,input.toString().toLowerCase());
            }
            else if(Character.isLowerCase(input.charAt(i))) {
                input.replace(i, i+1,input.toString().toUpperCase());
            }
            System.out.println(input);
        }
    }
 }

【问题讨论】:

  • 请修正你的缩进
  • 您使用 StringBuilder 而不仅仅是 String 有什么原因吗?
  • 我猜是因为它接近于可变字符串。

标签: java stringbuilder


【解决方案1】:

当你这样做时:

input.replace(i, i+1, input.toString().toLowerCase());

您正在用整个字符串(小写)替换一个字符,使input 越来越长,因此您永远不会到达它的结尾。

改为:

input.replace(i, i+1, input.substring(i,i+1).toLowerCase());

与转换为大写的地方类似。

编辑:修复了将错误的参数类型传递给replace

Volune 的回答看起来更好。使用它。

【讨论】:

  • Character.toLowerCase(input.charAt(i)) 是一个char 并且不被replace 方法接受。请改用input.substring(i, i + 1).toLowerCase()
  • 我认为开始和结束索引都应该是i(相同)。 replace() method 指定两个索引都包含
  • StringBuilder类型中的replace(int, int, String)方法不适用于参数(int, int, char) :/
  • @PM77-1 不,它没有。它说结局是独家的。
【解决方案2】:

由于你只想替换一个字符,你应该使用StringBuilder#setCharAt:

if (Character.isDigit(input.charAt(i))) {
    input.setCharAt(i, '*');
} else if (Character.isUpperCase(input.charAt(i))) {
    input.setCharAt(i, Character.toLowerCase(input.charAt(i)));
} else if (Character.isLowerCase(input.charAt(i))) {
    input.setCharAt(i, Character.toUpperCase(input.charAt(i)));
}

这样你就知道你不会改变字符串的长度。

【讨论】:

    【解决方案3】:

    使用StringUtils.swapCase:

    String res = StringUtils.swapCase(original).replaceAll("\\d","*");
    

    【讨论】:

      【解决方案4】:

      你需要使用Character#toUpperCaseCharacter#toLowerCase

      public static void main(String[] args){
      
      
                  StringBuilder input = new StringBuilder("800 Test St NY");
                  for (int i = 0; i < input.length(); i++) {
                      System.out.println(input.charAt(i));
      
                      if(Character.isDigit(input.charAt(i))){
                          input.replace(i,i+1,"*");
                      }
                      else if(Character.isUpperCase(input.charAt(i))) {
                          input.replace(i, i+1,Character.toString(Character.toLowerCase(input.charAt(i))));
                      }
                      else if(Character.isLowerCase(input.charAt(i))) {
                          input.replace(i, i+1,Character.toString(Character.toUpperCase(input.charAt(i))));
                      }
                      System.out.println(input);
                  }
              }
      

      打印(上面代码的输出:)

      8
      *00 Test St NY
      0
      **0 Test St NY
      0
      *** Test St NY
      
      *** Test St NY
      T
      *** test St NY
      e
      *** tEst St NY
      s
      *** tESt St NY
      t
      *** tEST St NY
      
      *** tEST St NY
      S
      *** tEST st NY
      t
      *** tEST sT NY
      
      *** tEST sT NY
      N
      *** tEST sT nY
      Y
      *** tEST sT ny
      

      【讨论】:

      • 为什么要投反对票?这是有效的,请运行代码,看看它是否失败,然后投反对票。
      • @user3764862,感谢您的检查。如果您相信它的工作,请投票。 :)
      • 我没有足够的声望来投票,但我真的很感谢你的帮助 :)
      • 输出错误。使用被赞成的答案之一来获得正确的输出。
      • @user3487063,你是对的。错误出在 Volune 的解决方案中。他没有将lower转换为upper,而是尝试在最后一个else if语句中将lower转换为lower。对于将错误的输出与您的输出进行比较,我深表歉意。
      猜你喜欢
      • 2014-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 2012-03-13
      相关资源
      最近更新 更多