我有两个List<String[]>
(字符串数组列表),我想将内容相互匹配。显然==
没有做到这一点,但.equals ()
似乎也没有这样做。那么我该如何检查字符串数组列表的内容是否相同呢?
顺便说一句,在上述两种情况下,我都收到了一条消息null
的例外。
编辑:确定...由于某种原因,只有x.equals(y)
有效,而不是y.equals(x)
。奇...
答案 0 :(得分:5)
也许最简单的解决方案是使用两个List<List<String>>
代替。假设使用List
实现扩展AbstractList
,使用equals
将为您提供所需的行为。来自AbstractList.equals
的文档:
将指定对象与此列表进行比较以获得相等性。返回
true
当且仅当指定的对象也是列表时,两个列表 具有相同的大小,以及两者中所有相应的元素对 列表相等。 (如果e1
,则两个元素e2
和(e1==null ? e2==null : e1.equals(e2))
相等。)换句话说,两个列表定义为 如果它们包含相同顺序的相同元素,则相等。
您可以使用Arrays.asList
轻松地将String[]
打包在扩展List<String>
的精简AbstractList
实施中。
编辑:以下是一个例子:
String[] array1 = {"1", "2", "3"};
String[] array2 = {"4", "7"};
String[] array3 = {"1", "2", "3"};
String[] array4 = {"4", "7"};
List<List<String>> lst1 = new ArrayList<>();
lst1.add(Arrays.asList(array1));
lst1.add(Arrays.asList(array2));
List<List<String>> lst2 = new ArrayList<>();
lst2.add(Arrays.asList(array3));
lst2.add(Arrays.asList(array4));
System.out.println(lst1.equals(lst2)); //prints true
答案 1 :(得分:3)
通常你应该避免处理数组。他们很丑,导致这些问题。如果可能,请使用List<List<String>>
,然后您可以正常使用.equals()
。
如果你坚持,你可以使用如下的自定义isequal实现。关键是使用Arrays.equals()
public class DemoEquals {
List<String[]> listOne = (List<String[]>) Arrays.asList(new String[]{"one1", "one2"}, new String[]{"two1"});
List<String[]> listOneOne = (List<String[]>) Arrays.asList(new String[]{"one1", "one2"}, new String[]{"two1"});
List<String[]> listTwo = (List<String[]>) Arrays.asList(new String[]{"2one1", "2one2"}, new String[]{"2two1"});
private boolean isEqual(List<String[]> list1, List<String[]> list2) {
if (list1.size() != list2.size()) return false;
for (int i = 0; i < list1.size(); i++) {
if (!Arrays.equals(list1.get(i), list2.get(i))) return false;
}
return true;
}
@SuppressWarnings("unchecked")
private void isEqual() {
//prints true
System.out.println(isEqual(Collections.EMPTY_LIST, Collections.EMPTY_LIST));
//prints true
System.out.println(isEqual(listOne, listOne));
//prints true
System.out.println(isEqual(listOne, listOneOne));
//prints false
System.out.println(isEqual(listOne, listTwo));
//prints false
System.out.println(isEqual(listOne, Collections.EMPTY_LIST));
}
public static void main(String[] args) {
new DemoEquals().isEqual();
}
}
答案 2 :(得分:0)
您可以使用INTERFACE Comparable。实现所需的方法,您可以使用List1.compare(List2)函数。
答案 3 :(得分:0)
只是.equals()
工作正常,但不知何故只在一个方向。
我接受了这个问题的第一个答案,但显然那个人已经删除了他的答案。
答案 4 :(得分:-1)
使用Jon Skeet对how to convert a List to a String(使用Guava)的回答,另一种选择是将2个列表转换为2个字符串,然后使用equals
进行比较。没有循环。