我有一个 ArrayList();
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("BBB");
list.add("cCc");
System.out.println(list.contains("aAa"));
在这里,我想在同一行中使用 equalsIgnoreCase 方法检查 contains() 方法。我该怎么做?
我有一个 ArrayList();
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("BBB");
list.add("cCc");
System.out.println(list.contains("aAa"));
在这里,我想在同一行中使用 equalsIgnoreCase 方法检查 contains() 方法。我该怎么做?
boolean containsEqualsIgnoreCase(Collection<String> c, String s) {
for (String str : c) {
if (s.equalsIgnoreCase(str)) {
return true;
}
}
return false;
}
你不能。的合同contains
是它遵从的equals
。Collection
这是界面的基本部分。您必须编写一个自定义方法来遍历列表并检查每个值。
从 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"));