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
答案 0 :(得分:1)
特里班:
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);
}