我有一个ArrayList();
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("BBB");
list.add("cCc");
System.out.println(list.contains("aAa"));
这里我想在同一行中使用equalsIgnoreCase方法检查contains()方法。 我该怎么办?
答案 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"));