Сделать элемент 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.
Спасибо и уважаем
Ответы
Ответ 1
Почему бы не использовать вместо этого 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 изменен в соответствии с комментариями. Спасибо всем вам, чтобы исправить меня.
Ответ 2
Вам нужно использовать
Collections.sort(a, String.CASE_INSENSITIVE_ORDER);
чтобы отсортировать игнорирование случая, вы можете использовать метод equalsIgnoreCase для String для сравнения со значениями
Вы можете, конечно, создать свой собственный класс CaseInsensitiveList, у нас есть CaseInsensitiveSet и CaseInsensitiveMap в нашей кодовой базе
Ответ 3
Вам нужно будет сделать это вручную:
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
Вы также можете обернуть свою String в вспомогательный класс и реализовать методы equals и сравнить.
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
Вам нужно будет переопределить метод equals() в списке, чтобы он делал то, что вы хотите. Посмотрите на текущий ArrayList.equals() и приспособите его, чтобы он сравнивался с equalsIgnoreCase вместо equals().
Ответ 6
Как насчет написания класса 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);
}
}
Ответ 7
Чтобы отсортировать список строк, игнорирующих регистр
Arrays.sort(myArray, Collator.getInstance());