首先,我不确定您的方法对自然语言处理的适用性。另外,现在还没有NLP的库吗?特别是,在NLP中,我知道有时候顺序和部分话题很重要,再加上这种方法对于单词变体来说不是很强大。
但是,如果你要坚持你的方法,一个想法,使其更具可读性和更容易维护(见下文更充分的优点/缺点)是这样的:
StringFinder finder = new StringFinder(phrase);
if (finder.containsAll("turn", "on").andOneOf("computer", "pc").andNot("off").matches()) {
turnOnComputer();
return;
} else if (finder.containsAll("turn", "off").andOneOf("computer", "pc").andNot("on").matches()) {
turnOffComputer();
return;
} else if (finder.containsAll("turn", "on").andOneOf("light", "lamp").andNot("off").matches()) {
...
} else if (finder.containsAll("turn")) { // If we reached this point
badPhrase();
} else if (...
的东西,如:
class StringFinder {
private final String phrase;
private final Map<String, Boolean> cache = new HashMap<String, Boolean>();
public StringFinder(String phrase) { this.phrase = phrase; }
public StringFinder containsAll(String... strings) {
for (String string : strings) {
if (contains(string) == false) return new FailedStringFinder(phrase);
}
return this;
}
public StringFinder andOneOf(String... strings) {
for (String string: strings) {
if (contains(string)) return this;
}
return FailedStringFinder(phrase);
}
public StringFinder andNot(String... strings) {
for (String string : strings) {
if (contains(string)) return new FailedStringFinder(phrase);
}
return this;
}
public boolean matches() { return true; }
private boolean contains(String s) {
Boolean cached = cache.get(s);
if (cached == null) {
cached = phrase.contains(s);
cached.put(s, cached);
}
return cached;
}
}
class FailedStringFinder extends StringFinder {
public boolean matches() { return false; }
// The below are actually optional, but save on performance:
public StringFinder containsAll(String... strings) { return this; }
public StringFinder andOneOf(String... strings) { return this; }
public StringFinder andNot(String... strings) { return this; }
}
缺点:
- 重复检查: “转” 检查多次。
- 重复模式(但看到下面的优点)。
优点:
- 相对简洁代码。
- 支票被复制但被缓存,因此性能仍然很高。
- 的条件是非常接近的操作,导致非常可读代码。
- 没有嵌套条件允许更改,恕不重组代码特定操作所需的条件,导致了很多维护的代码。
- 易于更改条件和操作出现的顺序,以控制优先级。
- 嵌套的缺乏使得它在未来更容易并行化。
- 灵活的条件检查:例如,您可以将方法添加到StringFinder以匹配重复检查,例如:
public StringFinder containsOnAndNotOff() { return containsAll("on").andNot("off"); }
或匹配您需要的一些特殊条件,如andAtLeast3Of(String... strings) {...}
。
- 缓存还可以扩展为不仅记住单词是否出现,而且记住整个模式是否出现。
- 您还可以添加最终条件:
andMatches(Pattern p)
(使用正则表达式模式) - 实际上,您可以使用正则表达式对许多其他检查进行建模。然后它可以很容易地缓存 - 而不是使用字符串作为键,使用模式。
来源
2013-05-08 08:26:18
Oak
@MarounMaroun感谢指出了这一点提供了答案的固定代码。它不应该,但我不想花时间用更多的if语句来解决这个问题。 – BLuFeNiX 2013-05-08 06:38:15
它不会。对不起,那是我的错。 – Maroun 2013-05-08 06:38:50
@MarounMaroun那么,它肯定有类似的问题。 – BLuFeNiX 2013-05-08 06:40:07