使ArrayList元素不区分大小写

Sat*_*tya 11 java collections case-insensitive

在我的Java应用程序中,我需要比较两个列表的元素是否相似.

简而言之,假设我有两个列表如下所示

List<String> a = new ArrayList<String>();
    a.add("one");
    a.add("three");
    a.add("two");
Collections.sort(a);


List<String> a1 = new ArrayList<String>();
    a1.add("ONE");
    a1.add("two");
    a1.add("THREE");
Collections.sort(a);
Run Code Online (Sandbox Code Playgroud)

如果我写了一个相等的条件,它会失败,因为列表的某些元素在不同的情况下就像

if(a.equals(a1)){
    System.out.println("equal");
} else{
    System.out.println("not equal");
}
Run Code Online (Sandbox Code Playgroud)

它将显示结果"不相等"

所以请告诉我如何使列表元素仅用Java语言不区分大小写.

谢谢

Rid*_*del 22

为什么不使用具有不区分大小写的比较器的SortedSet?使用String.CASE_INSENSITIVE_ORDER比较器

您的代码减少到

Set<String> a = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
    a.add("one");
    a.add("three");
    a.add("two");


Set<String> a1 = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
    a1.add("ONE");
    a1.add("two");
    a1.add("THREE");
Run Code Online (Sandbox Code Playgroud)

而你的平等条件应该没有任何问题

编辑根据评论修改.感谢大家纠正我.

  • 另请参见String类中的`String.CASE_INSENSITIVE_ORDER`静态比较器 (3认同)
  • 你实际应该*使用你在示例代码中定义的`Comparator` ;-) (2认同)

Jon*_*man 14

你需要使用

Collections.sort(a, String.CASE_INSENSITIVE_ORDER);
Run Code Online (Sandbox Code Playgroud)

为了对忽略大小写进行排序,可以使用String上的equalsIgnoreCase方法来比较值

您当然可以创建自己的CaseInsensitiveList类,我们的代码库中有一个CaseInsensitiveSet和CaseInsensitiveMap


Joa*_*uer 7

您必须手动执行此操作:

public boolean equalsIgnoreCase(List<String> l1, List<String> l2) {
  if (l1.size() != l2.size()) {
    return false;
  }
  Iterator<String> i1=l1.iterator();
  Iterator<String> i2=l2.iterator();
  while(i1.hasNext()) {
    if (!i1.next().equalsIgnoreCase(i2.next()) {
      return false;
    }
  }
  return true;
}
Run Code Online (Sandbox Code Playgroud)


Rap*_*vet 6

您还可以将String包装到辅助类中,并为其实现equals&compare方法.

public class StringWrapper implements Comparable<StringWrapper> {
    private String value;

    StringWrapper(Strig value) {
        this.value = value;
    }

    @Override boolean equals(Object o) {
        returns String.CASE_INSENSITIVE_ORDER.equals(
            (StringWrapper) o).value
            this.value);
    }

    @Override int compareTo(StringWrapper sw) {
        returns String.CASE_INSENSITIVE_ORDER.compare(
            this.value
            sw.value);        
    }

    @Override String toString() {
        return this.value;
    }

    @Override int hashCode() {
        return this.value.toLowerCase.hashCode();
    }
}

And then :

List<StringWrapper> a = new ArrayList<StringWrapper>();
    a.add(StringWrapper("one"));
    a.add(StringWrapper("TWO"));
    a.add(StringWrapper("three"));
Collections.sort(a);
Run Code Online (Sandbox Code Playgroud)