字符串切换语句不起作用

时间:2014-08-13 02:18:37

标签: java loops switch-statement

该计划的目的是将摩尔斯电码翻译成英文。我将程序的执行逻辑划分为三种情况:一个莫尔斯代码字符的翻译,两个字符和三个+字符。该程序试图翻译属于案例三的字符。如果您可以提供帮助,并决定测试该程序,请输入至少四个莫尔斯代码字符(介于a和d之间)!否则,期待一些异常的例外!


我使用的开关出了什么问题?我已经读过,直到几年前,Java还不支持使用Strings的switch语句。 Java现在支持String switch语句,如果我没有弄错的话,我的语法与这些语句的非常复杂的约定一致。为了确定编译器是否首先识别开关的主题(即switch (aReferenceThatPointsToaString),我在开关前面的行中打印了参考。没有问题。我还看了一下如果开关&#是否可以执行的情况39; s主题是明确说明的。我没有说switch (array3[i]),而是在switch ("._")写了这个测试确实导致了工作转换,让我觉得switch(array3[i])不是{\ n}与switch(aStringexpression)

完全相同
import java.util.Scanner;

public class MorseToEnglish1 {

public static void main (String[]args){
    System.out.println("enter morse here");
    Scanner input = new Scanner (System.in);
    String container = input.nextLine();

    char [] array = container.toCharArray();
    int count = 0;
    for (int i = 0; i < array.length; i++) {
    if (array[i] == ' ')
        count++ ;
    }

    // count counts the number of times a space appears

    System.out.println(count);
    int [] array2 = new int [count];
    int counter = 0;
    for (int i = 0; i < array.length; i++) {
        if (array[i] == ' '){
            array2[counter] = i;
            counter ++ ;
        }
    }

    // array2 assigns the indexes of spaces to its members

    System.out.println(counter);

    String [] array3 = new String [array2.length - 1];
    for (int i = 0; i < array3.length ; i ++)
        array3[i] = container.substring(array2[i], array2[i+1]);
        // array3 creates substrings based on these spaces
    System.out.print (array3[1]);
    System.out.print(array3[0]);

    // tests above

    for (int i = 0; i < array3.length; i ++){
        switch (array3[i]){
        case ("._"):
            { System.out.println("a");
            break; }
        case "_...":
            { System.out.println("b");
            break; }
        case "_._.":
            { System.out.println("c");
            break;}
        case "_..":
            { System.out.println("d ");
            break;}
        }   

    }   

    input.close();
}
}   

3 个答案:

答案 0 :(得分:3)

你的switch声明没有错,其余的节目有很多错误......

问题是,您的自定义“拆分”过程会在文本中留下空格,因此,如果要输入._ _... _._. _..,则数组将被拆分为...

" _...", " _._."

两个帐号出错了,其中一个,我输入的内容丢失了,两个,它在String中留下了前导空格字符,所以当你尝试比较String中的switch时{1}}声明,您实际上是在尝试做类似的事情......

"_...".equals(" _...")

哪会失败......

首先,这个“手动”拆分代码...

char[] array = container.toCharArray();
int count = 0;
for (int i = 0; i < array.length; i++) {
    if (array[i] == ' ') {
        count++;
    }
}

// count counts the number of times a space appears
System.out.println(count);
int[] array2 = new int[count];
int counter = 0;
for (int i = 0; i < array.length; i++) {
    if (array[i] == ' ') {
        array2[counter] = i;
        counter++;
    }
}

// array2 assigns the indexes of spaces to its members
System.out.println(counter);

String[] array3 = new String[array2.length - 1];
for (int i = 0; i < array3.length; i++) {
    array3[i] = container.substring(array2[i], array2[i + 1]);
}
// array3 creates substrings based on these spaces
System.out.println(array3[1]);
System.out.println(array3[0]);

应该替换为......

String[] array3 = container.split(" ");

坦率地说,我不知道它想要实现什么,如果输入String上的代码少于4个,并且无论如何都没有正确解析输入(抛弃值),它就会中断

答案 1 :(得分:1)

您的拆分代码会留下前导空格字符,导致它们无法正确匹配。您应该使用String.split版本来生成array3。这将创建正确的子串,工作量大大减少。

编辑: 您的拆分代码似乎也不包括第一个和最后一个莫尔斯代码,这就是当您输入少于4时获得ArrayIndexOutOfBoundsExceptions的原因。

答案 2 :(得分:-4)

从查看代码中你得到了太多}花括号。你只需要在switch语句的末尾有一个。

case ("._"):
        {System.out.println("a");
        break;
    case "_...":
        {System.out.println("b");
        break;
    case "_._.":
        {System.out.println("c");
        break;
    case "_..":
        {System.out.println("d ");
        break;
        }

它应该工作。我的假设当然是您的问题是您的代码无法编译。我非常确定你发布的代码不会这样做。