ArrayList包含区分大小写

我目前正在使用属于ArrayList类的包含方法进行search。 有没有办法让这个search大小写在java中不敏感? 我发现在C#中可以使用OrdinalIgnoreCase。 有没有一个Java的等价物,或另一种方式来做到这一点? 谢谢。

你可以像使用任何其他ArrayList一样使用它。 您可以将此列表传递给其他代码,而外部代码将不必理解任何string包装类。

public class CustomStringList3 extends ArrayList<String> { @Override public boolean contains(Object o) { String paramStr = (String)o; for (String s : this) { if (paramStr.equalsIgnoreCase(s)) return true; } return false; } } 

如果您使用的是Java 8,请尝试:

 List<String> list = ...; String searchStr = ...; boolean containsSearchStr = list.stream().filter(s -> s.equalsIgnoreCase(searchStr)).findFirst().isPresent(); 

传统上,您可以开发自己的逻辑来比较由ArrayList持有的string。 可能有几种方法可以做到这一点,如下所示。

 public boolean containsCaseInsensitive(String strToCompare, ArrayList<String>list) { for(String str:list) { if(str.equalsIgnoreCase(strToCompare)) { return(true); } } return(false); } 

为什么不应该像SortedSet那样使用一些直接和方便的方式,如下所示, 不区分大小写的比较器 ?

 Set<String> a = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER); a.add("A"); a.add("B"); a.add("C"); Set<String> b = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER); b.add("a"); b.add("b"); b.add("c"); System.out.println(b.equals(a)); 

会比较两个不同的集忽略情况,并返回true ,在这种特定的情况下,你的比较将没有任何问题的工作。

在Java8中,使用anyMatch

 List<String> list = Arrays.asList("XYZ", "ABC"); String matchingText = "xYz"; boolean isMatched = list.stream().anyMatch(matchingText::equalsIgnoreCase); 

看看Java API ,没有包含这样的方法。

但是你至less可以做两件事:

  1. 用你自己的或equalsIgnoreCase(str)重写ArrayList对象中的equals方法,
  2. 写你自己的包含方法,它应该遍历你的ArrayList实体,并进行手动检查。

     ArrayList<String> list = new ArrayList<String>(); ... containsIgnoreCase("a", list); public boolean containsIgnoreCase(String str, ArrayList<String> list){ for(String i : list){ if(i.equalsIgnoreCase(str)) return true; } return false; } 

假设你有一个ArrayList<String>

关于我能想到的唯一方法就是创build一个非常简单的包装类,围绕一个String创build一个非常简单的包装类,并且重写equals和hashcode来忽略大小写,尽可能利用equalsIgnoreCase() 。 那么你将有一个ArrayList<YourString> 。 虽然这是一个很丑陋的想法。

ArrayList的contains()方法通过调用您提供的对象(不是数组中的对象)的equals()方法来检查相等性。 因此,一个稍微黑客的方法是围绕String对象创build一个包装类,如下所示:

 class InsensitiveStringComparable { private final String val; public InsensitiveStringComparable(String val) { this.val = val; } @Override public boolean equals(Object x) { if (x == this) return true; else if (x == null) return false; else if (x instanceof InsensitiveStringComparable) return ((InsensitiveStringComparable) x).val.equalsIgnoreCase(val); else if (x instanceof String) /* Asymmetric equals condition */ return val.equalsIgnoreCase((String) x); else return false; } @Override public int hashCode() { return val.toUpperCase().hashCode(); } } 

然后你可以用它来执行你的testing。 示例“手动”testing用例:

 public class Test { public static void main(String[] args) { ArrayList<Object> a = new ArrayList<Object>(); a.add("test"); System.out.println(a.contains(new InsensitiveStringComparable("TEST"))); System.out.println(a.contains(new InsensitiveStringComparable("tEsT"))); System.out.println(a.contains(new InsensitiveStringComparable("different"))); } } 

您可以使用collections4(apache)中的IterableUtils和Predicate。

 List<String> pformats= Arrays.asList("Test","tEst2","tEsT3","TST4"); Predicate<String> predicate = (s) -> StringUtils.equalsIgnoreCase(s, "TEST"); if(IterableUtils.matchesAny(pformats, predicate)) //it is true // do stuff } 

org.apache.commons.collections4.IterableUtils.html

contains方法基于存储在ArrayList中的对象的equals方法返回的内容。 所以是的,如果你使用equals对象使用不区分大小写的比较是可能的。

所以你可以例如使用这样的类(代码可能仍然包含一些错别字)

 public class CaseInsensitiveString{ private final String contents; public CaseInsensitiveString( String contents){ this.contents = contents; } public boolean equals( Object o ){ return o != null && o.getClass() == getClass() && o.contents.equalsIgnoreCase( contents); } public int hashCode(){ return o.toUpperCase().hashCode(); } } 

另一个scheme

 public class IgnorecaseList extends ArrayList<String>{ @Override public boolean contains(Object o) { return indexOf(o) >= 0; } @Override public int indexOf(Object o) { if(o instanceof String){ for (int i = 0; i < this.size(); i++) { if(((String)o).equalsIgnoreCase(get(i))){ return i; } } } return -1; } } 

contains()方法使用indexOf …在这种溶剂中,你也可以知道哪里位置是string。 list.add("a") – > list.indexOf("A") == 0list.indexOf("a") == 0 ..

你也应该考虑使用一个Set而不是List。

不需要额外的function,可以通过将比较的string转换为大写或小写来获得预期的结果

(我知道这是在评论中提出的,但没有完全作为答案提供)

例如:根据JTextField提供的input过滤JList的内容时忽略大小写:

 private ArrayList<String> getFilteredUsers(String filter, ArrayList<User> users) { ArrayList<String> filterUsers = new ArrayList<>(); users.stream().filter((user) -> (user.getUsername().toUpperCase().contains(filter.toUpperCase()))).forEach((user)-> { filterUsers.add(user.getUsername()); }); this.userList.setListData(filterUsers.toArray()); return filterUsers; /** * I see the redundancy in returning the object... so even though, * it is passed by reference you could return type void; but because * it's being passed by reference, it's a relatively inexpensive * operation, so providing convenient access with redundancy is just a * courtesy, much like putting the seat back down. Then, the next * developer with the unlucky assignment of using your code doesn't * get the proverbially dreaded "wet" seat. */ } 

对于java8

list.stream()。anyMatch(s – > s.equalsIgnoreCase(yourString))

对于<java8

  • 正如上面的Aaron J Lang所build议的那样
  • 或者,如果你知道你的列表大小写(全部大写/全部小写),那么在比较之前将searchstring转换为合适的大小写

它是一个最好的方式来将您的列表项目转换为小写。 转换后你将使用包含方法。 喜欢

 List<String> name_list = new ArrayList<>(); name_list.add("A"); name_list.add("B"); 

使用上面创build的name_list创build小写列表

 List<String> name_lowercase_list = new ArrayList<>(); for(int i =0 ; i<name_list.size(); i++){ name_lowercase_list.add(name_list.get(i).toLowerCase().toString()); } for(int i =0 ; i<name_list.size(); i++){ String lower_case_name = name_list.get(i).toLowerCase().toString(); if(name_list.get(i).contains(your compare item) || name_lowercase_list.get(i).contains(your compare item) ){ //this will return true } } 

在我的情况下,因为ArrayList中的所有string都是小写字母,所以我只是执行String。 contains()参数的toLowerCase()方法。 喜欢这个:

 If (yourArrayList.contains (parameterInput.toLowerCase()) { // your code here } 

正如你所看到的,你可以做相反的事情,如果你有arrayList有大写string:

 If (yourArrayList.contains (parameterInput.toUpperCase ()) { // your code here } 

使用这种方法,你不需要重写任何东西。 在你的arrayList有大小写混合的情况下是例外。

我将这样做public boolean isStringInList(final List<String> myList, final String stringToFind) { return myList.stream().anyMatch(s -> s.equalsIgnoreCase(stringToFind)); } public boolean isStringInList(final List<String> myList, final String stringToFind) { return myList.stream().anyMatch(s -> s.equalsIgnoreCase(stringToFind)); }