1

我需要传递一个包含许多参数的字符串参数。收到参数时,我使用 String.split() 对其进行拆分以获取所有参数。但是出现了一个问题。如何设计我的字符串 decollat​​or 以便可以正确传递键盘上的任何 ASCII 代码。 希望得到任何建议。

4

4 回答 4

1

选择一个易于输入且不太可能出现在输入中的字符。假设字符是#

正常输入就好了Item 1#Item 2#Item 3。实际上,您可以.trim()每一项都可以让用户输入Item 1 # Item 2 # Item 3,如果他/她喜欢的话。

但是,就像您描述的那样,假设用户想输入Item #1,Item #2等。有几种方法可以让他/她这样做,但更容易的是让他们逃脱分隔符。例如,代替Item #1 # Item #2 # Item #3会导致正常找到 6 个不同项目的 ,让用户输入,例如Item ##1 # Item ##2 # Item ##3。然后在您的解析中,确保处理#连续输入两个或多个 ' 的情况。split可能不够好,您必须自己遍历字符串。

这是一个为您拆分输入字符串的方法的草图:

private static List<String> parseArguments(String input) {
    ArrayList<String> arguments = new ArrayList<String>();
    String[] prelArguments = input.split("#");
    for (int i = 0; i < prelArguments.length; i++) {
        String argument = prelArguments[i];
        if (argument.equals("")) {
            // We will enter here if there were two or more #'s in a row
            StringBuilder combinedArgument = new StringBuilder(arguments.remove(arguments.size() - 1));
            int inARow = 0;
            while (prelArguments[i+inARow].equals("")) {
                inARow++;
                combinedArgument.append('#');
            }
            i += inARow;
            combinedArgument.append(prelArguments[i]);
            arguments.add(combinedArgument.toString());
        } else {
            arguments.add(argument);
        }
    }
    return arguments;
}

上面缺少错误处理、极端情况处理和一些性能改进,但我认为这个想法是通过的。

于 2012-08-27T12:45:34.403 回答
1

我会消除这个问题,即滥用 String 作为参数容器。如果您需要传递更多参数,请传递更多参数。如果这失控了,请考虑传递一个地图,或者一个可以包含所有参数的自定义对象。

于 2012-08-27T22:08:54.257 回答
1

如果我理解正确 - 您需要将一组参数编码为一个字符串。您可以为此目的使用一些字符序列,例如

final String delimiter = "@#@"
String value = "param1@#@param2@#@param3";
String[] parameters = value.split(delimiter);
于 2012-08-27T12:07:58.290 回答
1

也许您可以查看可变参数而不是拆分字符串。例如:

public void method(String... strings) {
    // strings is actually an array
    String firstParam = strings[0];
    String secondParam = strings[1];
    // ...
}

来电:

method("string1");
method("string1", "string2", "string3");
// as many string args as you want
于 2012-08-27T12:01:39.660 回答