參數解析

題目描述

在命令行輸入以下命令: 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);
    }
}
相關文章
相關標籤/搜索