在我的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语言区分大小写。
谢谢并考虑
答案 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());