2012-07-18 72 views
0

嘿StackOverflow社區,使用掃描儀閱讀短語

所以,我有這條信息從一個txt文件,我需要解析。

下面是一個例子線:

- >日期&時間交流電源日照溫度風速
- > MM/DD/YYYY HH:MM.SS千瓦W /平方公尺華氏度英里

使用scanner.nextLine()爲我提供了一個包含整行的字符串,然後將其傳遞到StringTokenizer中,然後將它們分隔爲使用空格作爲分隔符的單個字符串。

所以第一行會分解成:
日期
&
時間
AC
電源
日照
等...

我需要的東西,如「日期&時間「在一起,和」交流電源「在一起。無論如何,我可以使用已在StringTokenizer或Scanner中定義的方法來指定此方法嗎?或者我會不得不開發我自己的算法來做到這一點?

你們會建議我使用其他形式的解析行而不是掃描儀嗎?或者,Scanner足夠滿足我的需求了嗎?

EJAY

+0

都喜歡的 「AC電源」 的標記事先知道? – 2012-07-18 21:22:48

+0

這個項目,他們不是。例如交流電源,風速等,總是會發生變化,所以即使現在一致,客戶也可以使用不同的領域,然後選擇「交流電源」。所以這會讓問題更加複雜一些。 – 2012-07-18 23:34:40

+0

uhm,實際上這使得問題變得不可能,除非你有一些魔法裝置來猜測標記 – 2012-07-18 23:41:53

回答

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); 
} 
+0

非常感謝!我可以用這個工作。 – 2012-07-19 00:47:58