使ArrayList元素不区分大小写

时间:2010-08-20 07:42:18

标签: 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);

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

if(a.equals(a1)){
    System.out.println("equal");
} else{
    System.out.println("not equal");
}

显示结果“不等于”

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

谢谢并考虑

7 个答案:

答案 0 :(得分:21)

为什么不使用带有不区分大小写的比较器的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");

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

根据评论修改

编辑。感谢大家纠正我。

答案 1 :(得分:14)

您需要使用

Collections.sort(a, String.CASE_INSENSITIVE_ORDER);

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

你当然可以创建自己的CaseInsensitiveList类,我们有一个CaseInsensitiveSet&amp;我们的代码库中的CaseInsensitiveMap

答案 2 :(得分: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;
}

答案 3 :(得分:6)

您还可以将String包装到辅助类中并实现等于&amp; 比较方法。

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);

答案 4 :(得分:0)

您需要覆盖列表中的equals()方法,以便它可以执行您想要的操作。查看当前的ArrayList.equals()并对其进行调整,使其与equalsIgnoreCase而不是equals()进行比较。

答案 5 :(得分:0)

如何将Wrapper类编写到您正在使用的List中,这样可以避免元素的存储不一致。

public class CaseInsensitiveStringList extends ArrayList<String> {

    @Override
    public void add(final int index, final String element) {
        super.add(index, element.toLowerCase());
    }

    @Override
    public boolean add(final String o) {
        return super.add(o.toLowerCase());
    }

    @Override
    public boolean addAll(final Collection<? extends String> c) {
        final ArrayList<String> temp = new ArrayList<String>(c.size());
        for (final String s : c) {
            temp.add(s.toLowerCase());
        }
        return super.addAll(temp);
    }

    @Override
    public boolean addAll(final int index, final Collection<? extends String> c) {
        final ArrayList<String> temp = new ArrayList<String>(c.size());
        for (final String s : c) {
            temp.add(s.toLowerCase());
        }
        return super.addAll(index, temp);
    }
}

答案 6 :(得分:0)

排序字符串列表忽略大小写

Arrays.sort(myArray, Collator.getInstance());