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

有没有选择忽略.contains()方法的情况?

我有一个DVD对象的ArrayList 。 每个DVD对象都有一些元素,其中一个是标题。 我有一个搜索特定标题的方法。 它有效,但我希望它不区分大小写。

我猜你的意思是在搜索字符串时忽略大小写?

我不知道,但您可以尝试将字符串转换为搜索到较低或大写,然后搜索。

 // s is the String to search into, and seq the sequence you are searching for. bool doesContain = s.toLowerCase().contains(seq); 

编辑:正如Ryan Schipper建议的那样,你也可以(并且可能会更好)做seq.toLowerCase(),具体取决于你的情况。

如果您使用的是Java 8

 List list = new ArrayList<>(); boolean containsSearchStr = list.stream().anyMatch("search_value"::equalsIgnoreCase); 
 private boolean containsIgnoreCase(List list, String soughtFor) { for (String current : list) { if (current.equalsIgnoreCase(soughtFor)) { return true; } } return false; } 

这可能不是解决特定问题的最佳方法,但您可以使用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完成的。 您最好尝试以下技巧之一:

  1. 学习CollatorCollationKey类。
  2. 如果您别无选择,只能留在Java世界中,请向DVD添加方法, boolean matches(String fragment) 。 让DVD告诉你它匹配的内容。
  3. 使用数据库。 如果它支持不区分大小写的排序规则,则以这种方式声明DVD表的title列。 无论您选择哪种方式,都可以使用JDBC或Hibernate或JPA或Spring Data。
  4. 如果数据库支持高级文本搜索(如Oracle),请使用它。
  5. 回到Java世界,使用Apache LuceneApache Solr
  6. 使用针对不区分大小写的匹配调整的语言。

如果可以等到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.至少你没有模式,没有匹配。

您无法保证始终返回String对象,或者您在List使用的对象实现了忽略大小写的方法。

如果您确实想要将集合中的String与某些独立于案例的内容进行比较,那么您需要迭代该集合并在不加大小写的情况下对它们进行比较。

 String word = "Some word"; List aList = new ArrayList<>(); // presume that the list is populated for(String item : aList) { if(word.equalsIgnoreCase(item)) { // operation upon successful match } } 

将操作数转换为小写(或大写)的直观解决方案具有为每个项实例化额外String对象的效果,这对大型集合无效。 此外,正则表达式比简单字符比较慢一个数量级。

String.regionMatches()允许以不区分大小写的方式比较两个String区域。 使用它,可以编写一个不区分大小写的“包含”方法的有效版本。 我用的是以下方法; 它基于Apache commons-lang的代码:

 public static boolean containsIgnoreCase(final String str, final String searchStr) { if (str == null || searchStr == null) { return false; } final int len = searchStr.length(); final int max = str.length() - len; for (int i = 0; i <= max; i++) { if (str.regionMatches(true, i, searchStr, 0, len)) { return true; } } return false; } 

在Java 8中,您可以使用Stream接口:

 return dvdList.stream().anyMatch(d -> d.getTitle().equalsIgnoreCase("SomeTitle")); 
  private List FindString(String stringToLookFor, List arrayToSearchIn) { List ReceptacleOfWordsFound = new ArrayList(); if(!arrayToSearchIn.isEmpty()) { for(String lCurrentString : arrayToSearchIn) { if(lCurrentString.toUpperCase().contains(stringToLookFor.toUpperCase()) ReceptacleOfWordsFound.add(lCurrentString); } } return ReceptacleOfWordsFound; } 

对于Java 8,您可以再添加一个解决方案,如下所示

 List list = new ArrayList<>(); String searchTerm = "dvd"; if(String.join(",", list).toLowerCase().contains(searchTerm)) { System.out.println("Element Present!"); } 

你可以应用这个小技巧。
将所有字符串更改为相同的大小写大写小写
对于C#代码:

列表searchResults = sl.FindAll(s => s.ToUpper(). Contains( seachKeyword.ToUpper() ));

对于Java代码:

 import java.util.*; class Test { public static void main(String[] args) { String itemCheck="check"; ArrayList listItem =new ArrayList(); listItem.add("Check"); listItem.add("check"); listItem.add("CHeck"); listItem.add("Make"); listItem.add("CHecK"); for(String item :listItem) { if(item.toUpperCase().equals(itemCheck.toUpperCase())) { System.out.println(item); } } } }