使用equalsIgnoreCase检查ArrayList <string>包含(“”)方法</string>

时间:2013-07-08 12:22:13

标签: java string collections

我有一个ArrayList();

List<String> list = new ArrayList<>();
list.add("aaa");
list.add("BBB");
list.add("cCc");
System.out.println(list.contains("aAa"));

这里我想在同一行中使用equalsIgnoreCase方法检查contains()方法。 我该怎么办?

3 个答案:

答案 0 :(得分:11)

boolean containsEqualsIgnoreCase(Collection<String> c, String s) {
   for (String str : c) {
      if (s.equalsIgnoreCase(str)) {
          return true;
      }
   }
   return false;
}

答案 1 :(得分:5)

你做不到。 contains的合同是指equals。这是Collection界面的基本部分。您必须编写一个自定义方法,遍历列表并检查每个值。

答案 2 :(得分:3)

从OO的角度来看,这是一个有趣的问题。

一种可能性是将您要强制执行的合同(无案件相等)的责任转移到收集的元素本身,而不是列表中,以适当分离关注点。

然后,您将为String对象添加一个新类(没有继承,String类为final),您将在其中实现自己的hashCode / equals合约。

// Strictly speaking, this is not a String without case, since only
// hashCode/equals methods discard it. For instance, we would have 
// a toString() method which returns the underlying String with the 
// proper case.
public final class StringWithoutCase {
  private final String underlying;

  public StringWithoutCase(String underlying) {
    if (null == underlying)
      throw new IllegalArgumentException("Must provide a non null String");
    this.underlying = underlying;
  }

  // implement here either delegation of responsibility from StringWithoutCase
  // to String, or something like "getString()" otherwise.

  public int hashCode() {
    return underlying.toLowerCase().hashCode();
  }

  public boolean equals(Object other) {
    if (! (other instanceof StringWithoutCase))
      return false;

    return underlying.equalsIgnoreCase(other.underlying);
  }
}

填充集合的对象将是StringWithoutCase

的实例
Collection<StringWithoutCase> someCollection = ...
someCollection.add(new StringWithoutCase("aaa"));
someCollection.add(new StringWithoutCase("BBB"));
someCollection.add(new StringWithoutCase("cCc"));