替换Switch语句中的Char

时间:2013-11-15 20:15:33

标签: java switch-statement

以下是使用下划线替换单词元音的代码:

String[] vowelArray = arrayInput;
    for (int x = 0; x < vowelArray.length; x++){
        for (int a = 0; a < vowelArray[x].length(); a++){
            switch (vowelArray[x].charAt(x)){
                case 'A': vowelArray[x].charAt(x) = "_";
                case 'a': vowelArray[x].charAt(x) = "_";
                case 'E': vowelArray[x].charAt(x) = "_";
                case 'e': vowelArray[x].charAt(x) = "_";
                case 'I': vowelArray[x].charAt(x) = "_";
                case 'i': vowelArray[x].charAt(x) = "_";
                case 'O': vowelArray[x].charAt(x) = "_";
                case 'o': vowelArray[x].charAt(x) = "_";
                case 'U': vowelArray[x].charAt(x) = "_";
                case 'u': vowelArray[x].charAt(x) = "_";
                case 'Y': vowelArray[x].charAt(x) = "_";
                case 'y': vowelArray[x].charAt(x) = "_";
            }
        }
    }

但是在编译时,我收到此错误:

  

线程“main”中的异常java.lang.Error:未解析的编译   问题:作业的左侧必须是变量

它出现在每个案例的switch语句中。 我做错了什么?

4 个答案:

答案 0 :(得分:6)

你无法在Java中更改String,它是一个不可变对象。您可以做的是从char[]获取基础String,修改数组,并使用它创建新的String(并且不要忘记使用case)结束每个break语句:

String[] vowelArray = arrayInput;
for (int x = 0; x < vowelArray.length; x++) {
    char[] chars = vowelArray[x].toCharArray();
    for (int a = 0; a < chars.length; a++) {
        switch (chars[a]) {
            case 'A': chars[a] = "_"; break;
            case 'a': chars[a] = "_"; break;
            case 'E': chars[a] = "_"; break;
            case 'e': chars[a] = "_"; break;
            case 'I': chars[a] = "_"; break;
            case 'i': chars[a] = "_"; break;
            case 'O': chars[a] = "_"; break;
            case 'o': chars[a] = "_"; break;
            case 'U': chars[a] = "_"; break;
            case 'u': chars[a] = "_"; break;
            case 'Y': chars[a] = "_"; break;
            case 'y': chars[a] = "_"; break;
        }
    }
    vowelArray[x] = new String(chars);
}

甚至更简单,您可以使用replaceAll()方法执行替换:

String[] vowelArray = arrayInput;
for (int x = 0; x < vowelArray.length; x++) {
    vowelArray[x] = vowelArray[x].replaceAll("[AaEeIiOoUuYy]", "_");
}

答案 1 :(得分:3)

字符串是不可变的,你正在做的事情(string.charAt(x) = "_";)并没有多大意义。您正在尝试为方法调用的结果分配值。错误消息还描述了语句的问题;编译器期望左侧有一个变量。

要执行您想要的操作,您可以使用带有String#replaceAll的正则表达式。

String newString = string.replaceAll("[AEIOUYaeiouy]", "_");

您甚至可以将其分配回旧字符串本身:

string = string.replaceAll("[AEIOUYaeiouy]", "_");

答案 2 :(得分:0)

由于您无法在Java中更改String,因此可以构建新字符串

 for (int x = 0; x < vowelArray.length; x++){
    StrinbBuilder b = new StringBuilder();
    for (int a = 0; a < vowelArray[x].length(); a++){
        switch (vowelArray[x].charAt(a)){
            case 'A'://fall thru
            case 'a'://fall thru
            //and all the other case's
             b.append("_");
           break;
           default:
             b.append(vowelArray[x].charAt(a));
             break;
        }

    }
    vowelArray[x] = b.toString(); //replace the new string
}

请注意,您的vowelArray[x].charAt(x)应为vowelArray[x].charAt(a)

您也可以使用其他方法代替大开关:

String vowels = "AaEeIiOoUuYy";
if (vowels.indexOf(vowelArray[x].charAt(x)) != -1) {
   //it's a vowel
   b.append("_");
} else {
   b.append(vowelArray[x].charAt(x));
}

答案 3 :(得分:0)

您无法通过更改一个字符来更改String。没有一种方法可以将带有字符String的新x(即s.charAt(x))更改为c,但您可以这样做:

String newString = s.substring(0,x) + c + s.substring(x+1);

s从0到x-1的字符(含);然后是角色c;然后是从s到结尾的x+1字符。这将适用于边界情况(x==0x==s.length()-1)。我发布这个作为“你会做什么而不是将charAt(x)放在作业左侧”的一般解决方案,但其他答案对于这个特定问题更好。