【问题标题】:Two Arraylists have the same elements but in different order, are they equal? [duplicate]两个 Arraylist 具有相同的元素但顺序不同,它们是否相等? [复制]
【发布时间】:2019-10-24 00:55:40
【问题描述】:

我有两个数组列表,每个都有 3 个元素。 PL1INITIAL1 是数组列表的。 INITIAL1 将被初始化,PL1 将被动态编辑。如果两者相等,则将执行操作,否则不执行任何操作。

PL1 = [00, 01, 02]
INITIAL1 = [01, 02, 00]

值相同但顺序不同。 这两个相等吗?

我能否断定两者是等价的并执行一些操作?

【问题讨论】:

  • 当两个数组列表包含相同数量的元素、相同的内容和相同的顺序时,就说它们是相等的。要检查它,您可以使用 .equals() 函数。
  • 不,在执行一些操作之前先对它们进行排序
  • @NicholasK 我刚刚编辑了它。现在?
  • 是的,好的。查看我之前评论中的链接 - 您的问题正是该问题的 dup

标签: java arraylist equals


【解决方案1】:

如果每个 List 中的元素通过 equals 方法(包括它们在 Lists 中的顺序)完全相同,则认为两个 List 相等。 因此,为了回答您的问题,

值相同但顺序不同。这两个相等吗?

由于它们的顺序不同,所以它们不相等。

我能否断定两者是等价的并执行一些操作?

我不知道您为什么需要这样做,但这是可能的。 您可以使用HashMap将INITIALS存储为key,并检查PL1的大小是否与Map的大小相同,并且Map是否包含PL1中的所有值通过equals检查。

或者简单地使用 Apache Commons CollectionUtils.isEqualCollection(Collection a, Collection b)

【讨论】:

  • 你也可以不使用HashMap。
  • HashSet 或 HashMap 可用于将迭代减少到最少。否则最好使用现有的 Apache 库。
【解决方案2】:
if (INITIAL1.size() == PL1.size() && INITIAL1.containsAll(PL1)) {
  //do something
}

【讨论】:

  • 不排序也能工作吗?
  • 这不是理想的解决方案。考虑以下输入 list1 = [1, 2, 3, 4, 3] & list2 = [1, 2, 3, 4, 4] 根据您的逻辑,上述输入的答案是正确的
  • @DeepChhowala,是的,你也可以不排序,看看我的答案。我用代码和链接进行了说明,这可能会对您有所帮助。
  • 是的,没有。 INITIAL1 的每个元素都将与 PL1 的每个元素进行比较。
  • @IamVickyAV 如何注意到,此解决方案不适用于具有非唯一元素的列表。如果您的列表只有唯一元素,请使用 Set 而不是 List。
【解决方案3】:

当两个数组列表包含相同数量的元素,相同的内容和相同的顺序时,就说它们是相等的。要检查它,您可以使用 .equals() 函数

例如:

import java.util.*;
public class HelloWorld{

     public static void main(String []args){
      ArrayList<String> list1=new ArrayList<String>();//Creating arraylist 
      list1.add("Ravi");//Adding object in arraylist    
      list1.add("Vijay");    
      list1.add("Ravi");    
      list1.add("Ajay");    
      //Invoking arraylist object   
      System.out.println(list1); 

      ArrayList<String> list2=new ArrayList<String>();//Creating arraylist 
      list2.add("Ravi");//Adding object in arraylist    
      list2.add("Vijay");    
      list2.add("Ravi");    
      list2.add("Ajay");    
      //Invoking arraylist object   
      System.out.println(list2); 

      if(list1.equals(list2)) {
          System.out.println("yes");
      }
     }
}

您的 Array 列表不会评估为相等,因为它们以不同的顺序具有不同的元素。

如果您希望它们在不排序的情况下评估为 true,请查看此链接

Java ArrayList - how can I tell if two lists are equal, order not mattering?

【讨论】:

    【解决方案4】:
    package com.practice;    
    import java.util.ArrayList;
    import java.util.List;
    public class twoArray 
    {
        public static void main(String[] args) 
        {
            List<Integer> list1 = new ArrayList<>();
            List<Integer> list2 = new ArrayList<>();
    
            list1.add(00);
            list1.add(01);
            list1.add(02);
            System.out.println(list1 +" Array list 1");   // [00,01,02] Array list 1
    
            list2.add(01);
            list2.add(02);
            list2.add(00);
            System.out.println(list2 +" Array list 2");   // [01,02,00] Array list 2
    
            System.out.println(list1.equals(list2));       // output: **false**         
        }
    }
    

    我希望在看完这个例子之后你会有一个想法。 由于 ArrayList 在内部使用索引(位置)来存储值。 根据您的要求 [00,01,02] 和 [01,02,00] 的值是相同的 排序不同,因此您使用 ArrayList 它返回错误!它是 不相等,您将无法执行任何操作。

    最好的解决方案是您只需 排序 PL1 和 INITIAL1 它返回 true。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-09
      • 1970-01-01
      • 2015-06-02
      • 2020-04-29
      相关资源
      最近更新 更多