Java 比较字符串数组的数组列表

Java 比较字符串数组的数组列表,java,arrays,arraylist,equals,Java,Arrays,Arraylist,Equals,我想比较字符串数组的两个ArrayList List<String[]> list1 = new ArrayList<String[]>; List<String[]> list2 = new ArrayList<String[]>; list1.equals(list2); 列表列表1=新的ArrayList; List list2=新的ArrayList; 列表1.等于(列表2); 这将返回false,因为ArrayLi

我想比较字符串数组的两个ArrayList

   List<String[]> list1 = new ArrayList<String[]>;
   List<String[]> list2 = new ArrayList<String[]>;

   list1.equals(list2);
列表列表1=新的ArrayList;
List list2=新的ArrayList;
列表1.等于(列表2);
这将返回false,因为ArrayList中的equals方法将对元素执行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());     
ListIterator e1=ListIterator();
ListIterator e2=((List)o).ListIterator();
而(e1.hasNext()&&e2.hasNext()){
eo1=e1.next();
对象o2=e2.next();
如果(!(o1==null?o2==null:o1.equals(o2)))
返回false;
}
回来!(e1.hasNext()| e2.hasNext());

若在数组上执行equals,它将检查引用相等。无论如何,我们可以使用list1.equals(list2)而不是检查数组列表中的每个元素。

使用equals是不可能的。你可以做,而不是做平等的事。您只需编写一个小函数,比如isEqual(),并在使用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 : 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;
          }

     }
{
ListIterator e1=ListIterator();
ListIterator e2=((List)o).ListIterator();
而(e1.hasNext()&&e2.hasNext()){
eo1=e1.next();
对象o2=e2.next();
if(!(o1==null?o2==null:isEqual(Arrays.alList(o1),Arrays.asList(o2)))
返回false;
}
返回!(e1.hasNext()| e2.hasNext());
}
布尔isEqual(列表1、列表2){
int originalSize=list1.size();
清单1.保留(清单2);
//列表1将保留列表2中存在的所有元素
//如果列表1包含列表2中存在的所有元素,则当前列表1的大小将等于“原始大小”`
if(list1.size()==originlaSize){
返回true;
}否则{
返回false;
}
}

为数组类制作一个简单的包装器

private String[] array;
public ArrayWrapper(String[] array) {
    this.array = array;
}
重写
equals(objectobj)
以使用
数组。equals(array,(String[])obj)
和just
hashCode()
就是
array.hashCode()
如果从
List
更改为
List
,则可以使用list1.equals(list2)

否则,您可能会看到以下内容:

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;
}

当你否决投票时,你应该更好地解释原因。op明确表示他们不希望数组的引用相等。似乎没有必要从数组中创建新的列表来比较它们的值。@SotiriosDelimanolis但op不希望手动执行,如果他担心性能,他可以对数组中的一个进行排序,然后在
O(nlogn)
@karthik中进行排序,这样就行了。请注意,有Arrays.equals,这与您的
isEqual
非常相似,仅在Arrays上您需要保留列表中包含数组的信息(因此至少应该是
ListIterator
,然后使用
Arrays.equals
而不是
o1.equals(o2)
)如果您将列表展平到一个维度,然后进行比较,会怎么样?或者您可以从一个列表更改为另一个列表?@njzk2,这是ArrayList中的equals方法。除非创建包装器类,否则无法更改this@Manikandan. 不。我指的是
数组。等于
数组中的
数组。谢谢。。我认为改变List@Manikandan不客气。如果您发现我的答案对您的问题有帮助,请单击我答案旁边的复选标记。
[[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