java contains 大小写_用.contains方法忽略大小写的选项?

这可能不是解决您的特定问题的最佳方法,但您可以使用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.至少你没有模式,没有匹配。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值