Tokenize String忽略尾随/前导空格

时间:2017-09-05 17:15:29

标签: java string tokenize

我必须创建一个getToken函数,它将从输入缓冲区一次返回一个标记。我还需要实现一个isWhiteSpace函数,如果传递给它的字符是空格(空格,制表符,换行符),则返回true;如果是CRLF或EOF,则返回false。

我的问题是,当我输入一个字符串时,它只会转到第一个空格字符并停止。如果我从一个空格开始,它只会打印一个空白字符串。我该如何解决这个问题?

public class Lab1 {

    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Welcome to the Tokenizer!");
        while (true) {
            System.out.print("Command: ");
            String s = sc.nextLine();
            String tk = getToken(s);
            if (tk.equals("quit")) {
                break;
            } else {
                System.out.println(tk);
            }
        }
    }

    static String getToken(String w) {
        String b = "";
        for (int i = 0; i < w.length(); i++) {
            char c = w.charAt(i);
            if (!isWhite(c)) {
                b = b + c;
            } else {
                b = b + "";
                break;
            }
        }
        return b;
    }


    static boolean isWhite(char ch) {
        return (ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n');
    }
}

1 个答案:

答案 0 :(得分:0)

如果每行有多个令牌,则必须将getToken方法重命名为getTokens并返回一个ArrayList of Strings。 然后,您可以遍历main方法上的标记。 以下是示例代码,其中包含一些建议的更改:

static ArrayList<String> getTokens(String w) {
    ArrayList<String> tokens = new ArrayList<>(0);
    StringBuilder lastWord = new StringBuilder();
    for (int i = 0; i < w.length(); i++) {
        char c = w.charAt(i);
        if (isWhiteSpace(c)) { // rename to isWhiteSpace, it's a more specific name
            tokens.add(lastWord); // if it's a white space add the last word to the list
            lastWord.clear(); // clear the buffer
        } else {
            lastWord.append(c); // append the char to the buffer
        }
    }
    // handle the last word
    if (lastWord.length() > 0) {
      tokens.add(lastWord);
    }
    return tokens;
}