好的,这是我的问题。我必须HashSet
的,我用的是removeAll
方法从一组中删除存在于另一组中的值。
在调用该方法之前,我显然将这些值添加到Set
s。我打电话.toUpperCase()
在各个String
在添加之前,因为两个列表中的值的情况不同。这个案子没有任何规律或理由。
一旦我打电话removeAll
,我需要取回原始案例以获取保留在中的值Set
。有没有一种有效的方法可以做到这一点,而无需运行原始列表并使用CompareToIgnoreCase
?
Example:
List1:
"BOB"
"Joe"
"john"
"MARK"
"dave"
"Bill"
List2:
"JOE"
"MARK"
"DAVE"
之后,创建一个单独的HashSet
对于每个列表使用toUpperCase()
on String
s。然后打电话removeAll
.
Set1.removeAll(set2);
Set1:
"BOB"
"JOHN"
"BILL"
我需要让列表再次看起来像这样:
"BOB"
"john"
"Bill"
任何想法将不胜感激。我知道它很差,原始列表应该有一个标准,但这不是我可以决定的。
在我最初的回答中,我不假思索地建议使用Comparator
,但这会导致TreeSet
违反equals合同 http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html#equals(java.lang.Object)并且是一个等待发生的错误:
// Don't do this:
Set<String> setA = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
setA.add("hello");
setA.add("Hello");
System.out.println(setA);
Set<String> setB = new HashSet<String>();
setB.add("HELLO");
// Bad code; violates symmetry requirement
System.out.println(setB.equals(setA) == setA.equals(setB));
最好使用专用类型:
public final class CaselessString {
private final String string;
private final String normalized;
private CaselessString(String string, Locale locale) {
this.string = string;
normalized = string.toUpperCase(locale);
}
@Override public String toString() { return string; }
@Override public int hashCode() { return normalized.hashCode(); }
@Override public boolean equals(Object obj) {
if (obj instanceof CaselessString) {
return ((CaselessString) obj).normalized.equals(normalized);
}
return false;
}
public static CaselessString as(String s, Locale locale) {
return new CaselessString(s, locale);
}
public static CaselessString as(String s) {
return as(s, Locale.ENGLISH);
}
// TODO: probably best to implement CharSequence for convenience
}
此代码不太可能导致错误:
Set<CaselessString> set1 = new HashSet<CaselessString>();
set1.add(CaselessString.as("Hello"));
set1.add(CaselessString.as("HELLO"));
Set<CaselessString> set2 = new HashSet<CaselessString>();
set2.add(CaselessString.as("hello"));
System.out.println("1: " + set1);
System.out.println("2: " + set2);
System.out.println("equals: " + set1.equals(set2));
不幸的是,这更加冗长。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)