Java Set <string>相等忽略大小写</string>

时间:2014-07-03 15:59:24

标签: java set ignore-case

我想通过忽略字母的情况来检查两组String的所有元素是否相等。

Set<String> set1 ;
Set<String> set2 ;
.
.
.
if(set1.equals(set2)){ //all elements of set1 are equal to set2 
 //dosomething
}
else{
 //do something else
}

但是,此等式检查不会忽略字符串的情况。还有其他方法吗?

6 个答案:

答案 0 :(得分:41)

或者,您可以使用TreeSet

public static void main(String[] args){
    Set<String> s1 = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
    s1.addAll(Arrays.asList(new String[] {"a", "b", "c"}));

    Set<String> s2 = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
    s2.addAll(Arrays.asList(new String[] {"A", "B", "C"}));

    System.out.println(s1.equals(s2));
}

答案 1 :(得分:3)

不幸的是,Java不允许您提供外部&#34;相等比较器&#34;:当您使用字符串时,HashSet仅使用内置hashCodeequals

您可以通过填充辅助HashSet<String>并将字符串转换为特定(即大写或小写)大小写,然后检查其相等性来解决此问题,如下所示:

boolean eq = set1.size() == set2.size();
if (eq) {
    Set<String> aux = new HashSet<String>();
    for (String s : set1) {
        aux.add(s.toUpperCase());
    }
    for (String s : set2) {
        if (!aux.contains(s.toUpperCase())) {
            eq = false;
            break;
        }
    }
}
if (eq) {
    // The sets are equal ignoring the case
}

答案 2 :(得分:2)

不是我知道的。

我能看到的最好的解决方案,虽然过度设计,但是要创建一个自定义持有者类,其中包含String实例字段(Stringfinal且无法继承)。

然后,您可以覆盖equals / hashCode,其中对于两个String属性equalsIgnoreCaseequals将返回true和{ {1}} s是平等的。

这意味着:

  • hashCode返回基于较低(或较高)的套接字的哈希码 属性的哈希码。
  • hashCode基于equals

    equalsIgnoreCase

<强>输出

class MyString {
    String s;

    MyString(String s) {
        this.s = s;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((s == null) ? 0 : s.toLowerCase().hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        MyString other = (MyString) obj;
        if (s == null) {
            if (other.s != null)
                return false;
        }
        else if (!s.equalsIgnoreCase(other.s))
            return false;
        return true;
    }

}
public static void main(String[] args) {
        Set<MyString> set0 = new HashSet<MyString>(
            Arrays.asList(new MyString[]
                {
                    new MyString("FOO"), new MyString("BAR")
                }
            )
        );
        Set<MyString> set1 = new HashSet<MyString>(
            Arrays.asList(new MyString[]
                {
                    new MyString("foo"), new MyString("bar")
                }
            )
        );
        System.out.println(set0.equals(set1));
 }

...如上所述,过度设计(但正在工作)。

答案 3 :(得分:2)

未经测试,但这是一般的想法:

public boolean setEqualsIgnoreCase(Set<String> a, Set<String>b)
{
    if (a.size() != b.size()) return false;
    Iterator<String> ai = a.iterator();
    Iterator<String> bi = b.iterator();
    while(ai.hasNext())
    {
         if (!ai.next().equalsIgnoreCase(bi.next())) return false;
    }
    return true;
}

答案 4 :(得分:0)

我会构建这样的东西(在某种形式的Java伪代码中):

Set<String> set1;
Set<String> set2;

if (set1.size() != set2.size()) {
  return NOT_EQUAL;
} else {
  Set<String> set3 = new HashSet<String>();
  for (String s: set1) set3.add(s.toUpperCase());
  for (String s: set2) set3.add(s.toUpperCase());
  return set1.size() == set3.size() ? EQUAL : NOT_EQUAL;
}

答案 5 :(得分:-4)

您可以使用循环和equalsIgnoreCase

testString.equalsIgnoreCase()