使用扫描仪阅读短语

时间:2012-07-18 20:57:16

标签: parsing whitespace java.util.scanner

Hey StackOverflow社区,

所以,我从一个需要解析的txt文件中获得了这一行信息。

以下是一个示例行:

- >日期和时间交流电源日照温度风速
- > mm / dd / yyyy hh:mm.ss kw W / m ^ 2 deg F mph

使用scanner.nextLine()给我一个字符串,其中包含整行,然后我将其传递给StringTokenizer,然后使用空格作为分隔符将它们分成单独的字符串。

所以对于第一行它会分解成:
日期
&安培;
时间
AC
电源
日照
等...

我需要“日期和时间”这样的东西,以及“交流电源”。无论如何我可以使用已经在StringTokenizer或Scanner中定义的方法来指定它吗?或者我是否必须开发自己的算法才能做到这一点?

你们建议我使用其他形式的解析线代替Scanner吗?或者,Scanner是否足以满足我的需求?

EJAY

1 个答案:

答案 0 :(得分:1)

哦,这个很棘手,也许你可以用你的代币建立一些Trie结构,我很无聊并写了一个小课程来解决你的问题。警告:它有点笨拙,但实施起来很有趣。

特里班:

class Trie extends HashMap<String, Trie> {

    private static final long serialVersionUID = 1L;
    boolean end = false;

    public void addToken(String strings) {
        addToken(strings.split("\\s+"), 0);
    }

    private void addToken(String[] strings, int begin) {
        if (begin == strings.length) {
            end = true;
            return;
        }

        String key = strings[begin];
        Trie t = get(key);
        if (t == null) {
            t = new Trie();
            put(key, t);
        }
        t.addToken(strings, begin + 1);

    }

    public List<String> tokenize(String data) {
        String[] split = data.split("\\s+");
        List<String> tokens = new ArrayList<String>();
        int pos = 0;
        while (pos < split.length) {
            int tokenLength = getToken(split, pos, 0);
            tokens.add(glue(split, pos, tokenLength));
            pos += tokenLength;
        }

        return tokens;
    }

    public String glue(String[] parts, int pos, int length) {
        StringBuilder sb = new StringBuilder();
        sb.append(parts[pos]);
        for (int i = pos + 1; i < pos + length; i++) {
            sb.append(" ");
            sb.append(parts[i]);
        }
        return sb.toString();
    }

    private int getToken(String[] tokens, int begin, int length) {
        if (end) {
            return length;
        }
        if (begin == tokens.length) {
            return 1;
        }

        String key = tokens[begin];
        Trie t = get(key);
        if (t != null) {
            return t.getToken(tokens, begin + 1, length + 1);
        }
        return 1;
    }
}

以及如何使用它:

Trie t = new Trie();
t.addToken("AC Power");
t.addToken("date & time");
t.addToken("date & foo");
t.addToken("Speed & fun");

String data = "date & time AC Power Insolation Temperature Wind Speed";

List<String> tokens = t.tokenize(data);
for (String s : tokens) {
    System.out.println(s);
}