这可能不是解决您的特定问题的最佳方法,但您可以使用String.matches(String regex)方法或等效的匹配器。我们只需要从您的未来标题构建一个正则表达式。这变得很复杂。
List matchingDvds(String titleFragment) {
String escapedFragment = Pattern.quote(titleFragment);
// The pattern may have contained an asterisk, dollar sign, etc.
// For example, M*A*S*H, directed by Robert Altman.
Pattern pat = Pattern.compile(escapedFragment, Pattern.CASE_INSENSITIVE);
List foundDvds = new ArrayList<>();
for (DVD dvd: catalog) {
Matcher m = pat.matcher(dvd.getTitle());
if (m.find()) {
foundDvds.add(dvd);
}
}
return foundDvds;
}
但是这样做效率低下,而且它纯粹用Java来完成。您最好尝试以下技巧之一:
了解Collator和CollationKey类。
如果你别无选择,只能留在Java世界,请在DVD上添加一个方法,boolean matches(String fragment)。让DVD告诉你它匹配的是什么。
使用数据库。如果它支持不区分大小写的排序规则,则以这种方式声明DVD表的title列。无论你选择什么,使用JDBC或Hibernate或JPA或Spring Data。
如果数据库支持高级文本搜索(如Oracle),请使用该搜索。
回到Java世界,请使用Apache Lucene并可能使用Apache Solr。
使用针对不区分大小写的匹配调整的语言。
如果您可以等到Java 8,请使用lambda表达式。你可以避开Pattern和Matcher类,我通过建立正则表达式这样上面使用:
String escapedFragment = Pattern.quote(titleFragment);
String fragmentAnywhereInString = ".*" + escapedFragment + ".*";
String caseInsensitiveFragment = "(?i)" + fragmentAnywhereInString;
// and in the loop, use:
if(dvd.getTitle().matches(caseInsensitiveFragment)) {
foundDvds.add(dvd);
}
但这编译模式太多次。那么下壳什么呢?
if (dvd.getTitle().toLowerCase().contains(titleFragment.toLowerCase()))
恭喜;你刚刚发现了土耳其问题。除非您在toLowerCase中声明语言环境,否则Java将查找当前语言环境。而较低的外壳是缓慢的,因为它必须考虑到土耳其无点我和虚线I.至少你没有模式,没有匹配。