我想比较两个字符串数组的ArrayList。
List<String[]> list1 = new ArrayList<String[]>;
List<String[]> list2 = new ArrayList<String[]>;
list1.equals(list2);
这将返回false,因为ArrayList中的equals方法将在元素上执行等于。
ListIterator<E> e1 = listIterator();
ListIterator<?> e2 = ((List<?>) o).listIterator();
while (e1.hasNext() && e2.hasNext()) {
E o1 = e1.next();
Object o2 = e2.next();
if (!(o1==null ? o2==null : o1.equals(o2)))
return false;
}
return !(e1.hasNext() || e2.hasNext());
如果你在数组上做等于它,它将检查引用相等性。无论如何我们可以使用list1.equals(list2)而不是检查数组列表中的每个元素。
答案 0 :(得分:1)
你不能通过使用equals来做到这一点。你可以做retainAll()而不是做等于。你可以写一个小函数,比如isEqual(),并在你使用equals的地方使用它。您需要将array
转换为列表并将其传递给此函数。
{
ListIterator<E> e1 = listIterator();
ListIterator<?> e2 = ((List<?>) o).listIterator();
while (e1.hasNext() && e2.hasNext()) {
E o1 = e1.next();
Object o2 = e2.next();
if (!(o1==null ? o2==null : isEqual(Arrays.alList(o1),Arrays.asList(o2))))
return false;
}
return !(e1.hasNext() || e2.hasNext());
}
boolean isEqual(List list1, List list2){
int originalSize = list1.size();
list1.retainAll(list2);
// list1 will retain all the elements that are present in list2
// if list1 has all the elements that are present in list2, present list1 size will be equal to `original size`
if(list1.size() == originlaSize){
returns true;
}else{
return false;
}
}
答案 1 :(得分:1)
如果您从List<String[]>
更改为List<List<String>>
,则可以使用list1.equals(list2)。
public static void main(String[] args) throws Exception {
List<List<String>> list1 = new ArrayList() {{
add(new ArrayList(Arrays.asList("a", "b", "c")));
add(new ArrayList(Arrays.asList("d", "e", "f")));
add(new ArrayList(Arrays.asList("g", "h", "i")));
}};
List<List<String>> list2 = new ArrayList() {{
add(new ArrayList(Arrays.asList("a", "b", "c")));
add(new ArrayList(Arrays.asList("d", "e", "f")));
add(new ArrayList(Arrays.asList("g", "h", "i")));
}};
System.out.println(list1);
System.out.println(list2);
System.out.println(list1.equals(list2));
}
结果:
[[a, b, c], [d, e, f], [g, h, i]]
[[a, b, c], [d, e, f], [g, h, i]]
true
否则,您可能正在寻找以下内容:
public static void main(String[] args) throws Exception {
List<String[]> list1 = new ArrayList() {{
add(new String[] {"a", "b", "c"});
add(new String[] {"d", "e", "f"});
add(new String[] {"g", "h", "i"});
}};
List<String[]> list2 = new ArrayList() {{
add(new String[] {"a", "b", "c"});
add(new String[] {"d", "e", "f"});
add(new String[] {"g", "h", "i"});
}};
System.out.println(listsEqual(list1, list2));
}
public static boolean listsEqual(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;
}
结果:
true
答案 2 :(得分:-1)
为数组类创建一个简单的包装器。
private String[] array;
public ArrayWrapper(String[] array) {
this.array = array;
}
覆盖equals(Object obj)
以使用Arrays.equals(array, (String[]) obj)
而hashCode()
只是array.hashCode()
。