代码之家  ›  专栏  ›  技术社区  ›  Satya

使ArrayList元素不区分大小写

  •  11
  • Satya  · 技术社区  · 14 年前

    简言之,假设我有两个声明如下的列表

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

    如果我写一个相等的条件,它就会失败,因为list的某些元素的大小写不同,比如

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

    所以,请告诉我如何使list元素只在Java语言中不区分大小写。

    感谢和关心

    7 回复  |  直到 14 年前
        1
  •  22
  •   Riduidel    14 年前

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

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

    编辑

        2
  •  14
  •   Jon Freedman    14 年前

    你需要使用

    Collections.sort(a, String.CASE_INSENSITIVE_ORDER);
    

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

        3
  •  7
  •   gizmo    14 年前

    您必须手动执行此操作:

    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;
    }
    
        4
  •  6
  •   Raphael Jolivet    14 年前

    您还可以将字符串包装到helper类中并实现 等于 & 比较 它的方法。

    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);
    
        5
  •  0
  •   Thorbjørn Ravn Andersen    14 年前

    您将需要重写列表上的equals()方法,以便它执行您想要的操作。看看水流数组列表等于()并对其进行调整,使其与equalsIgnoreCase而不是equals()进行比较。

        6
  •  0
  •   Johannes Wachter    14 年前

    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);
        }
    }
    
        7
  •  0
  •   Harshita Sethi    8 年前

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

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