java - 按分隔的字母搜索词过滤列表
问题描述
我有某种列表,例如下面的示例,其中包含 (Car & Racoon) 单词。如果我想搜索“c r”,我希望它返回“Car”而不是“Racoon”。以下是我目前的方法,但它不考虑字母顺序并返回我“浣熊”。对于任何以空格分隔的搜索词/字母,我想要一个尽可能灵活的解决方案。
String[] words_list = {"Car", "Racoon"};
String search_input = "c r";
String[] input_parts = search_input.trim().toLowerCase().split(" ");
for (String word : words_list){
int matches= 0;
for (String letter : input_parts) {
if (word.toLowerCase().contains(letter)) {
++matches;
}
}
if (matches == input_parts.length) {
Log.d("Result : ", word);
}
}
解决方案
这是正则表达式的一个很好的用例。尝试这样的事情:
String[] wordsList = {"Car", "Racoon"};
String searchInput = "c r";
String searchRegEx = searchInput.replace(" ", ".{1}");
Pattern pattern = Pattern.compile(searchRegEx, Pattern.CASE_INSENSITIVE);
System.out.println("RegEx (case-insensitive) is: " + searchRegEx);
for (String word : wordsList){
Matcher matcher = pattern.matcher(word);
boolean match = matcher.matches();
System.out.println("Test word '"+word + "' and match was: " + match);
}
如您所见,我找到了每个空格并将其替换为.{1}
这意味着任何字符的一个实例。如果你想开放匹配一个或多个字符,你可以使用类似的东西.+
。或者,您可以更具体地指定只匹配大小写字符 az:[a-zA-Z]{1}
或[a-zA-Z]+
. 这Pattern.CASE_INSENSTIVE
很重要,因为否则您的单词列表具有大写字母C
将Car
与小写输入不匹配。
在这种情况下,编译 Pattern 是一个重要的优化。如您所知,RegEx 可能很慢,如果您在 for 循环中内联它,它将为每个测试编译您的正则表达式,这将是缓慢且低效的。
推荐阅读
- c# - 模拟在类中返回表达式树的函数
- powerbi - power bi 服务浏览器看起来奇怪而空洞
- c++ - 不能调用 future::get 存储在地图中的未来
- c# - StructureMap StructureMap.StructureMapBuildPlanException,避免 ObjectFactory
- android - 如何在 Android 中集成 Firebase 性能监控
- javascript - parseInt() 和基数基础
- ibm-cloud - 如何使用 project-lib python 将二进制文件保存到我的项目资产中?
- ios - Instruments 显示内存泄漏 - Xcode 9.4 和 Simulator iPhoneX 11.4
- node.js - node.js setInterval 不会触发 this。目的
- ios - 具有自定义数据库的 AWS AppSync 是否支持订阅?