多くのパラメータを含む文字列パラメータを渡す必要があります。パラメータを受け取ったら、String.split()を使用してパラメータを分割し、すべてのパラメータを取得します。しかし、1つの問題が発生しました。キーボード上のASCIIコードが正しく渡されるように文字列デコレータを設計する方法。 何かアドバイスを期待します。
4 に答える
文字列を分割する代わりに、可変個引数の引数を確認できるかもしれません。例えば:
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
私が正しく理解していれば、パラメータのセットを1つの文字列にエンコードする必要があります。この目的のために、いくつかの文字シーケンスを使用できます。
final String delimiter = "@#@"
String value = "param1@#@param2@#@param3";
String[] parameters = value.split(delimiter);
入力しやすく、入力に表示されにくい文字を選択してください。文字が。であると仮定しましょう#
。
通常の入力は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
。次に、構文解析で、2つ以上#
のが連続して入力された場合のケースを処理するようにしてください。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;
}
エラー処理、エッジケース処理、およびパフォーマンスの向上は上記に欠けていますが、アイデアは実現したと思います。
文字列を引数コンテナとして誤用するという問題を解消します。より多くのパラメーターを渡す必要がある場合は、より多くのパラメーターを渡します。これが手に負えなくなった場合は、マップ、またはすべてのパラメーターを含むことができるカスタムオブジェクトを渡すことを検討してください。