如何在 Java 中使用字符串类型的 ArrayList 搜索字符串值?
How can I search String value with ArrayList of String type in Java?
我有一个城市列表,想从这些城市中搜索:
ArrayList myCities; // list of cities
String searchString = scanner.nextLine();
List<String> matchedCities = new ArrayList(); // an empty list for storing matched cities
for(String c : myCities){
if(c.matches("(?i)" + searchString + ".*")){
matchedCities.add(c);
}
}
例如。 apple 如果它是数组中的一个元素
当前 c returns apple of if ap entered 或 apple 但不是 ppl.
这仅适用于以或 start/initials 开头的城市,但是我希望如果用户从中间输入字符串,它应该 return 建议的城市;
例如如果用户输入 ppl,它应该 return apple,或任何包含 ppl 的单词,无论它是否以 ppl 开头或包含在中间或以以下结尾。
String::matches
隐含地检查整个字符串,就好像应用了“^”和“$”锚点一样,因此检查中间值的一个小修复是更新正则表达式以允许任何前缀".*"
.
此外,可能需要将 searchString
放在 \Q
和 \E
之间以启用 字符串文字 搜索,并自动可能为正则表达式保留的转义字符。
if (c.matches("(?i).*\Q" + searchString + "\E.*")){
matchedCities.add(c);
}
另一种选择是将 searchString
和列表中的元素转换为相同的大小写并使用 contains
.
使用 Stream 的示例实现 API:
String search = searchString.toLowerCase();
List<String> matchedCities = cities
.stream()
.filter(c -> c.toLowerCase().contains(search))
.collect(Collectors.toList());
更新
到return/打印search
字符串后面的单词部分,可以使用String::substring
、String::indexOf
和String::length
:city.substring(city.indexOf(search) + search.length())
String search = searchString.toLowerCase();
List<String> afterMatch = cities
.stream()
.filter(c -> c.toLowerCase().contains(search))
.map(c -> c.substring(c.indexOf(search) + search.length()))
.peek(System.out::println) // print the part after the search
.collect(Collectors.toList());
我有一个城市列表,想从这些城市中搜索:
ArrayList myCities; // list of cities
String searchString = scanner.nextLine();
List<String> matchedCities = new ArrayList(); // an empty list for storing matched cities
for(String c : myCities){
if(c.matches("(?i)" + searchString + ".*")){
matchedCities.add(c);
}
}
例如。 apple 如果它是数组中的一个元素 当前 c returns apple of if ap entered 或 apple 但不是 ppl.
这仅适用于以或 start/initials 开头的城市,但是我希望如果用户从中间输入字符串,它应该 return 建议的城市;
例如如果用户输入 ppl,它应该 return apple,或任何包含 ppl 的单词,无论它是否以 ppl 开头或包含在中间或以以下结尾。
String::matches
隐含地检查整个字符串,就好像应用了“^”和“$”锚点一样,因此检查中间值的一个小修复是更新正则表达式以允许任何前缀".*"
.
此外,可能需要将 searchString
放在 \Q
和 \E
之间以启用 字符串文字 搜索,并自动可能为正则表达式保留的转义字符。
if (c.matches("(?i).*\Q" + searchString + "\E.*")){
matchedCities.add(c);
}
另一种选择是将 searchString
和列表中的元素转换为相同的大小写并使用 contains
.
使用 Stream 的示例实现 API:
String search = searchString.toLowerCase();
List<String> matchedCities = cities
.stream()
.filter(c -> c.toLowerCase().contains(search))
.collect(Collectors.toList());
更新
到return/打印search
字符串后面的单词部分,可以使用String::substring
、String::indexOf
和String::length
:city.substring(city.indexOf(search) + search.length())
String search = searchString.toLowerCase();
List<String> afterMatch = cities
.stream()
.filter(c -> c.toLowerCase().contains(search))
.map(c -> c.substring(c.indexOf(search) + search.length()))
.peek(System.out::println) // print the part after the search
.collect(Collectors.toList());