用于非字符输入的Java StreamTokenizer?

时间:2013-12-17 07:46:40

标签: java stringtokenizer

我有一个java二进制搜索树,我想创建一个菜单。

到目前为止,我使用StreamTokenizer来获取用户输入,

但现在它似乎不适用于"+""-""?"

我的代码:

public void listen() throws IOException {
    boolean stay = true;
    System.out.println("Give me commands .. ");

    while(stay) {
        tokens.nextToken();
        if(tokens.sval.equals("+")) {
            tree.insert(new PositiveInt((int) tokens.nval));                
        } else if(tokens.sval.equals("?")) {
            System.out.println(
                    tree.retrieve(new PositiveInt((int) tokens.nval)) == null ? "Not exist" : "exist");
        } else if(tokens.sval.equals("-")) {
            tree.remove(new PositiveInt((int) tokens.nval));                
        } else if(tokens.sval.equalsIgnoreCase("K")) {
            tree.writeKeys();
        } else if(tokens.sval.equalsIgnoreCase("E")) {
            System.out.println("Empty = " + tree.isEmpty());                                
        } else if(tokens.sval.equalsIgnoreCase("F")) {
            System.out.println("Full = " + tree.isFull());              
        } else if(tokens.sval.equalsIgnoreCase("C")) {
            tree.clear();               
        } else if(tokens.sval.equalsIgnoreCase("P")) {
            tree.showStructure();               
        } else if(tokens.sval.equalsIgnoreCase("Q")) {
            stay = false;               
        } else {
            System.out.println("Unaccaptable input.");              
        }
    }
}

例如,当我输入“P”或任何其他角色时,一切都没问题。

当我输入"?""+""-"时,我收到了:

Exception in thread "main" java.lang.NullPointerException
    at TestBSTree.listen(TestBSTree.java:27)
    at TestBSTree.main(TestBSTree.java:54)

第27行是:

        if(tokens.sval.equals("+")) {

换句话说,非字符表不适用于标记器。

为什么以及如何解决?

整个代码:

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;


public class TestBSTree {
    // Test class variables
    BSTree<PositiveInt> tree;
    InputStreamReader reader;
    StreamTokenizer tokens;
    PositiveInt key;
    int in;

public TestBSTree(PositiveInt root) {
    tree = new BSTree<PositiveInt>(new BSTreeNode<>(root, null, null));
    reader = new InputStreamReader(System.in);
    tokens = new StreamTokenizer(reader);
    key = null;
}

public void listen() throws IOException {
    boolean stay = true;
    System.out.println("Give me commands .. ");

    while(stay) {
        tokens.nextToken();
        if(tokens.sval.equals("+")) {
            tree.insert(new PositiveInt((int) tokens.nval));                
        } else if(tokens.sval.equals("?")) {
            System.out.println(
                    tree.retrieve(new PositiveInt((int) tokens.nval)) == null ? "Not exist" : "exist");
        } else if(tokens.sval.equals("-")) {
            tree.remove(new PositiveInt((int) tokens.nval));                
        } else if(tokens.sval.equalsIgnoreCase("K")) {
            tree.writeKeys();
        } else if(tokens.sval.equalsIgnoreCase("E")) {
            System.out.println("Empty = " + tree.isEmpty());                                
        } else if(tokens.sval.equalsIgnoreCase("F")) {
            System.out.println("Full = " + tree.isFull());              
        } else if(tokens.sval.equalsIgnoreCase("C")) {
            tree.clear();               
        } else if(tokens.sval.equalsIgnoreCase("P")) {
            tree.showStructure();               
        } else if(tokens.sval.equalsIgnoreCase("Q")) {
            stay = false;               
        } else {
            System.out.println("Unaccaptable input.");              
        }
    }
}

public static void main(String[] args) throws IOException {
    TestBSTree test = new TestBSTree(new PositiveInt(0));
    test.listen();
}

}

  • 树或PositiveInt如何实现并不重要,主要问题是tokenizer。

1 个答案:

答案 0 :(得分:0)

如果你想分裂一个包含'?'的字符串或加号('+'),您不能简单地使用此符号来拆分此字符串;他们是保留'单词',需要一个排除标志'\',它本身需要一个排除标志^^(所以你需要两个'\\'和特殊标志)

尝试使用类似的东西:

StringTokenizer tokenizer = new StringTokenizer("ghj?klm", "\\?");
System.out.println(tokenizer.countTokens() );

- &GT;结果:计数是2!

您也可以将此方法应用于String.split(“\ _ +”);

//wont work!!
String str = "ghj?klm";
String[] s = str.split("?");
System.out.println(s.length );

但是这段代码可以使用!

String str = "ghj?klm";
String[] s = str.split("\\?");
System.out.println(s.length );

这是'问题'^^我希望这有帮助!

不幸的是,我不知道哪些其他符号需要一个slahs ......: - (