題目描述
在命令行輸入以下命令: xcopy /s c:\ d:\, 各個參數以下:
參數1:命令字xcopy
參數2:字符串/s
參數3:字符串c:\
參數4: 字符串d:\
請編寫一個參數解析程序,實現將命令行各個參數解析出來。
解析規則:
1.參數分隔符爲空格
2.對於用「」包含起來的參數,若是中間有空格,不能解析爲多個參數。
好比在命令行輸入xcopy /s 「C:\program files」 「d:\」時,參數仍然是4個,
第3個參數應該是字符串C:\program files,而不是C:\program,注意輸出參數時,須要將「」去掉,引號不存在嵌套狀況。
3.參數不定長
4.輸入由用例保證,不會出現不符合要求的輸入
輸入描述
輸入一行字符串,能夠有空格
輸出描述
輸出參數個數,分解後的參數,每一個參數都獨佔一行
輸入例子
xcopy /s c:\\\ d:\\\
輸出例子
4
xcopy
/s
c:\\\
d:\\\
算法實現
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* Declaration: All Rights Reserved !!!
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt"));
while (scanner.hasNext()) {
String input = scanner.nextLine();
System.out.println(argAnalysis(input));
}
scanner.close();
}
/**
* 分析參數,【還有另一種方法,就是直接利用數組來處理,可減小時間複雜度和空間複雜度,處理起來會麻煩一些】
* @param s
* @return
*/
private static String argAnalysis(String s) {
List<String> list = new ArrayList<>();
// 表示最後一個"出現的下一個位置,若是沒有"就爲0
int prev = 0;
for (int i = 0; i < s.length(); ) {
// i開始的第一個雙引號
if (s.charAt(i) == '"') {
// 添加不包雙引號的字符串
list.add(s.substring(prev, i));
for (int j = i + 1; j < s.length(); j++) {
// 開始的第二個雙引號
if (s.charAt(j) == '"') {
list.add(s.substring(i, j + 1));
i = j + 1;
prev = i;
}
}
} else {
i++;
}
}
// 【1】
// // 表示沒有"
// if (prev == 0) {
// list.add(s);
// }
// // 還有最後一個沒有
// else if (prev < s.length()) {
// list.add(s.substring(prev, s.length()));
// }
// 【2】,【1】【2】實現一樣的效果
if (prev < s.length()) {
list.add(s.substring(prev, s.length()));
}
// 下面處理空格,雙引號引發的字符串不做處理
int result = 0;
StringBuilder builder = new StringBuilder();
for (String t : list) {
// 若是不以"開始
if (!t.startsWith("\"")) {
String[] sts = t.split("\\s+");
result += sts.length;
for (String st : sts) {
builder.append(st).append('\n');
}
} else {
result++;
builder.append(t).append('\n');
}
}
return result + "\n" + builder.substring(0, builder.length() - 1);
}
}