0

ねえStackOverflowコミュニティ、

だから、私は解析する必要があるtxtファイルからこの情報の行を持っています。

行の例を次に示します。

->日付と時刻AC電源絶縁温度風速
->mm/ dd / yyyy hh:mm.ss kw W / m ^ 2 deg F mph

Scanner.nextLine()を使用すると、行全体を含む文字列が得られます。次に、これをStringTokenizerに渡します。次に、空白を区切り文字として使用して、文字列を個々の文字列に区切ります。

したがって、最初の行では、
日付

時刻の
AC
電源
日射量
などに分割されます。

「日時」と「AC電源」が一緒に必要です。とにかく、StringTokenizerまたはScannerですでに定義されているメソッドを使用してこれを指定できますか?それとも、これを行うために独自のアルゴリズムを開発する必要がありますか?

スキャナーの代わりに他の形式の解析行を使用することをお勧めしますか?または、スキャナーは私のニーズに十分対応できますか?

ejay

4

1 に答える 1

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