如何组合Switch语句?

时间:2016-02-21 21:42:59

标签: java input switch-statement echo

我是Java新手,正在完成学校作业。目标是创建一个将在unix中模拟Echo工具的Java类。如果我输入:

  

java Echo'我爱你'

它会打印出来:

  

我爱你

然后有两个命令行选项
-n:省略尾随换行符
-e:启用反斜杠转义的解释 我还需要能够同时使用-n和-e。

到目前为止,我已经找到了如何分别实施-n-e的方法。这是代码:

public class Echo {

    public static void main(String []args) {

        switch (args[0]) {
            case "-n":
                for (int i=1; i<args.length;i++)
                    System.out.print(args[i]);
                break;

            case "-e":
                for (int i=1; i<args.length; i++) {
                    args[i]=args[i].replace("\\t", "\t");
                    args[i]=args[i].replace("\\n","\n");
                    System.out.println(args[i]);
                }
                break;
            default:
                for (int i=0; i<args.length; i++)
                System.out.println(args[i]);
        }
    }    
}

我尝试更改代码,以便输入:

  

java Echo -n -e'ilove \ tyou'

  

java Echo -e -n'ilove \ tyou'

它根本不起作用。这是我的尝试:

public class Echo {

    public static void main(String []args) {

        if ((args[0].equals("-n") || args[0].equals("-e")) && (args[1].equals("-e") ||args[1].equals("-n"))) {
            for (int i=2; i<args.length; i++) {
                args[i]=args[i].replace("\\t", "\t");
                args[i]=args[i].replace("\\n","\n");
                System.out.print(args[i]);
            }
        } else {
            switch (args[0]) {
                case "-n":
                    for (int i=1; i<args.length;i++)
                        System.out.print(args[i]);
                    break;
                case "-e":
                    for (int i=1; i<args.length; i++) {
                        args[i]=args[i].replace("\\t", "\t");
                        args[i]=args[i].replace("\\n","\n");
                        System.out.println(args[i]);
                    }
                    break;
                default:
                    for (int i=0; i<args.length; i++)
                        System.out.println(args[i]);
            }
        }
    }
}

4 个答案:

答案 0 :(得分:1)

您需要注意标记位于args[]内的位置以及字符串所在的位置。由于您的args[]长度为1(无标记),因此您无法不加区分地访问args[1]

正如the comment by RC中所述,首先找到标志并稍后才应用它们的效果要容易得多。我假设标志必须在字符串之前,因此保证字符串在最后一个单元格中。从那里,向后看旗帜。

public class Example {

    public static void main(String[] args) {

        boolean hasE = false;
        boolean hasN = false;
        String message = args[args.length - 1];

        for (int i = args.length - 2; i >= 0; i--) {
            switch (args[i]) {
                case "-n": hasN = true; break;
                case "-e": hasE = true; break;
            }
        }

        if (hasE)
            message = message.replace("\\n", "\n").replace("\\t", "\t");
        if (hasN)
            System.out.print(message);
        else
            System.out.println(message);
        System.out.println("Test");
    }
}

备注:

  • 我没有做输入验证(你没有在你的作业或代码中提及它,我不想做整个作业)。提示:检查args.length是否为0或大于3。
  • 我假设您只需要转义制表符和换行符。如果你需要逃避更多的事情,那么就需要更复杂的正则表达式。
  • 我在最后添加了一个打印件,以便轻松检查-n
  • 的效果

答案 1 :(得分:0)

尝试做这样的事情:

public class Echo {

    public static void main(String []args) {
        boolean isTrailingActive = false;
        boolean isEscapingActive = false;
        String inputStr;
        int index = 0;

        // Validates the amount of arguments passed to Echo
        if (args.length == 0 || args.length > 3) {
            return;
        }

        while (index < args.length - 1) {
            // Validates trailing active
            if (args[index].equals("-n")) {
                isTrailingActive = true;
                index++;
            }

            // Validates escaping active
            if (args[index].equals("-e")) {
                isEscapingActive = true;
                index++;
            }
        }

        inputStr = args[index];

        if (isEscapingActive) {
            inputStr = inputStr.replace("\\t", "\t").replace("\\n","\n");
        }

        if (isTrailingActive) {
            System.out.print(inputStr);
        } else {
            System.out.println(inputStr);
        }
    }
}

答案 2 :(得分:0)

有两种解决方案:
1)使用CommandLine的API,有很多。

2)在你的args上执行foreach ...你可以管理你的最后一个argurment作为字符串来回应或从每个args构建它

boolean optionNewline = false;  
boolean optionE = false;  
StringBuilder sb = new StringBuilder();

for(String arg : args) {
    if ("-n".equals(arg)) {
        optionNewline = true;
    }
    else if ("-e".equals(arg)) {
        optionE = true;
    }
    else {
        // TEXT
        if(sb.length() > 0) {
            sb.append(' ');    //space between text part ?
        }
        sb.append(arg);
    }
} // foreach
// DO MY JOB on SB.toString();  

答案 3 :(得分:-2)

我会这样做:

processingDetails

公平地说,我对Unix中的“Echo”工具并不熟悉,所以我不知道这段代码是否有用。注意:您可能希望在单独的方法中输入“-n”和“-e”时编写代码 - 考虑到您将调用此代码两次。