Сделать элемент ArrayList нечувствительным к регистру

В моем приложении 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.

Спасибо и уважайте

11
задан Joachim Sauer 20 August 2010 в 07:43
поделиться

6 ответов

Почему бы вместо этого не использовать 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");

И ваши условия равенства должны работать без каких-либо проблем

EDIT , измененных в соответствии с комментариями. Спасибо всем, кто поправил меня.

22
ответ дан 3 December 2019 в 01:00
поделиться

Как насчет написания класса-обертки для используемого вами списка, это позволит избежать непоследовательного хранения элементов.

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);
    }
}
0
ответ дан 3 December 2019 в 01:00
поделиться

Вам нужно использовать

Collections.sort(a, String.CASE_INSENSITIVE_ORDER);

, чтобы отсортировать регистр игнорирования, вы можете использовать метод equalsIgnoreCase в String для сравнения с values ​​

Вы, конечно, можете создать свой собственный класс CaseInsensitiveList, у нас есть CaseInsensitiveSet и CaseInsensitiveMap в нашей кодовой базе

14
ответ дан 3 December 2019 в 01:00
поделиться

Вам придется сделать это вручную:

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;
}
7
ответ дан 3 December 2019 в 01:00
поделиться

Вам нужно будет переопределить метод equals () в списке, чтобы он делает что хочешь. Взгляните на текущий ArrayList.equals () и адаптируйте его так, чтобы он сравнивался с equalsIgnoreCase вместо equals ().

0
ответ дан 3 December 2019 в 01:00
поделиться

Вы также можете обернуть свою 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);
6
ответ дан 3 December 2019 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: