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