0

嘿 StackOverflow 社区,

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

这是一个示例行:

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

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

因此,对于第一行,它将分为:
日期

时间
AC
Power
Insolation
等...

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

你们会建议我使用其他形式的解析行而不是 Scanner 吗?或者,扫描仪是否足以满足我的需求?

杰伊

4

1 回答 1

1

哦,这个很棘手,也许你可以用你的令牌建立一些Trie结构,我很无聊,写了一个小类来解决你的问题。警告:这有点hacky,但实现起来很有趣。

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);
}
于 2012-07-18T23:40:19.340 回答