4

我有一个 ArrayList();

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

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

4

3 回答 3

11
boolean containsEqualsIgnoreCase(Collection<String> c, String s) {
   for (String str : c) {
      if (s.equalsIgnoreCase(str)) {
          return true;
      }
   }
   return false;
}
于 2013-07-08T12:25:36.187 回答
5

你不能。的合同contains是它遵从的equalsCollection这是界面的基本部分。您必须编写一个自定义方法来遍历列表并检查每个值。

于 2013-07-08T12:24:46.890 回答
3

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

一种可能性是将您想要执行的合同的责任(不区分大小写)转移到收集的元素本身,而不是列表,以适当分离关注点。

然后,您将为您的 String 对象添加一个新类(没有继承,String类是最终的),您将在其中实现自己的 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"));
于 2013-07-08T12:35:23.917 回答