【问题标题】:Checking if an ArrayList contains a certain String while being case insensitive在不区分大小写的情况下检查 ArrayList 是否包含某个字符串
【发布时间】:2016-10-12 15:12:14
【问题描述】:

如何在不区分大小写的情况下使用 .contains 方法搜索 ArrayList?我试过 .containsIgnoreCase 但发现 IgnoreCase 方法只适用于字符串。

这是我正在尝试创建的方法:

 private ArrayList<String> Ord = new ArrayList<String>(); 

 public void leggTilOrd(String ord){
     if (!Ord.contains(ord)){
         Ord.add(ord);
     }
 }

【问题讨论】:

  • 非常不清楚。完成您的代码
  • 尝试遍历列表以搜索您的字符串
  • .containsIgnoreCase 是什么意思,但发现它只适用于字符串??
  • IgnoreCase 方法只对字符串有效,对数组列表无效。
  • @VictorSorokin 不要尝试,就去做吧 :)

标签: java arraylist


【解决方案1】:

您需要遍历列表并检查每个元素。这就是contains 方法中发生的事情。由于您希望对正在检查的 String 元素使用 equalsIgnoreCase 方法而不是 equals 方法,因此您需要明确地执行此操作。这可以使用 for-each 循环或 Stream(下面的示例使用 Stream)。

private final List<String> list = new ArrayList<>();

public void addIfNotPresent(String str) {
    if (list.stream().noneMatch(s -> s.equalsIgnoreCase(str))) {
        list.add(str);
    }
}

【讨论】:

    【解决方案2】:

    如果您使用的是 Java7,只需重写 contains() 方法,

    public class CastInsensitiveList extends ArrayList<String> {
        @Override
        public boolean contains(Object obj) {
            String object = (String)obj;
            for (String string : this) {
                if (object.equalsIgnoreCase(string)) {
                  return true;
                }
            }
            return false;
        }
    }
    

    如果您使用 Java 8.0,使用流式 API,

    List<String> arrayList = new ArrayList<>();
    arrayList.stream().anyMatch(string::equalsIgnoreCase);
    

    【讨论】:

      【解决方案3】:

      List#Ccontains() 方法检查参数是否存在于列表中但未对列表元素进行更改

      改用流

      public void leggTilOrd(String ordParameter) {
          final List<String> ord = Arrays.asList(new String[]{ "a", "A", "b" });
          final boolean ordExists = ord.stream().anyMatch(t -> t.equalsIgnoreCase(ordParameter));
          System.out.println(ordExists);
      }
      

      【讨论】:

        【解决方案4】:

        如果您想避免重复,请使用 HashSet 而不是 List。搜索时散列的工作速度更快。在底层类中重写 equals 和 hashcode 方法以使用 String.toUpperCase() 返回预期结果。如果你有一个字符串列表,你可以创建一个字符串包装类。

        字符串包装器可能如下所示:-

        public class CaseInsensitiveString {
        
            String string;
        
            @Override
            public int hashCode() {
                final int prime = 31;
                int result = 1;
                result = prime * result + ((string == null) ? 0 : string.toUpperCase().hashCode());
                return result;
            }
        
            @Override
            public boolean equals(Object obj) {
                if (this == obj)
                    return true;
                if (obj == null)
                    return false;
                if (getClass() != obj.getClass())
                    return false;
                CaseInsensitiveString other = (CaseInsensitiveString) obj;
                if (string == null) {
                    if (other.string != null)
                        return false;
                } else if (!string.toUpperCase().equals(other.string.toUpperCase()))
                    return false;
                return true;
            }
        
            // Other Methods to access string
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-01-11
          • 1970-01-01
          • 2017-04-28
          • 2015-07-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多