ArrayList包含区分大小写

Joh*_*ohn 64 java arraylist

我目前正在使用属于ArrayList类的contains方法进行搜索.有没有办法让这个搜索案例在java中不敏感?我发现在C#中可以使用OrdinalIgnoreCase.有没有Java等价物,或其他方式来做到这一点?谢谢.

Aar*_*ang 65

您可以像使用任何其他ArrayList一样使用它.您可以将此List传递给其他代码,外部代码不必理解任何字符串包装类.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这假定插入List后不需要原始案例.哪种可能.这取决于OP的用例.或者,并行维护第二个列表.一个是原始数据,第二个是小写. (6认同)
  • @rfeak非常真实!有点尴尬我错过了.事后看来,我会使用一个地图,包含小写字符串的键和原始字符串的值 (2认同)
  • 现在只是为了好玩而头脑风暴,我相信我们对OP有很好的选择.你可以像这样继承子类,但是不是重写add()和get(),你可以使用覆盖contains()来利用equalsIgnoreCase()吗?理想的存在,相同的存储使用,保持原始的String内容/顺序,保持String参数(vs我的想法)并简单地实例化不同的List实现. (2认同)

Fre*_*ded 38

在Java8中,使用anyMatch

List<String> list = Arrays.asList("XYZ", "ABC");
String matchingText = "xYz";

boolean isMatched = list.stream().anyMatch(matchingText::equalsIgnoreCase);
Run Code Online (Sandbox Code Playgroud)


Jos*_*h M 34

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

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

  • 我知道它已经过时但你也可以使用anyMatch()代替filter().findFirst().isPresent() (18认同)

Lio*_*ion 14

传统上,您可以开发自己的逻辑来比较一个字符串ArrayList.可能有几种方法可以这样做,如下所示.

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

为什么不应该使用一些直接和方便的方法,如下面所示的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));
Run Code Online (Sandbox Code Playgroud)

比较两个不同的集合忽略案例和返回true,在这种特殊情况下,你的比较将没有任何问题.


小智 9

查看Java API,没有包含此类方法.

但你至少可以做两件事:

  1. 用您自己或equalsIgnoreCase(str)覆盖ArrayList对象中的equals方法
  2. 编写自己的contains方法,该方法应遍历您的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;
    }
    
    Run Code Online (Sandbox Code Playgroud)


rfe*_*eak 7

假设你有一个 ArrayList<String>

关于我能想到的唯一方法是在String周围创建一个非常轻的包装类,并覆盖equals和hashcode以忽略大小写,equalsIgnoreCase()尽可能利用它.然后你会有一个ArrayList<YourString>.虽然这有点丑陋.

  • 不是一个痛苦的失败者,但不会扩展List比扩展/包装所有字符串更简单/更有效/更兼容? (5认同)
  • +1,但我不同意你的上一个声明:对于应用程序来说,几乎不是一个丑陋的解决方案. (3认同)