【问题标题】:finding the commen objects in two arraylist [closed]在两个arraylist中找到共同的对象[关闭]
【发布时间】:2021-08-09 02:47:54
【问题描述】:

需要查找到arraylist之间的共同对象。它们都是VarList 类型,这是简单的 POJO 类。我的比较返回了数据库列表中的所有元素,需要在两个数组列表之间有一个共同的元素(如您所见,它们是对象)并将它们添加到新列表中。

VarList 类

public class VarList {
    private int number;
    private int age;
    private String name;
    public VarList(int number, int age, String name) {
        super();
        this.number = number;
        this.age = age;
        this.name = name;
    }
    public int getNumber() {
        return number;
    }
    public void setNumber(int number) {
        this.number = number;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

我的解决方案有问题

//database arraylist
        ArrayList<VarList> database=new ArrayList<VarList>();
        database.add(new VarList(105,19,"b"));
        database.add(new VarList(101,18,"c"));
        database.add(new VarList(106,54,"database"));
//object array list        
        ArrayList<VarList> object=new ArrayList<VarList>();
        object.add(new VarList(105,19,"b"));
        database.add(new VarList(106,54,"database"));


        List<VarList> resultList = new ArrayList<VarList>();
        for(VarList user1 : database) {
            for(VarList user2 : object) {
                if(user1.getName().equals(user2.getName())) {
                    resultList.add(user2);
                }
                System.out.println(resultList);
            }
        }

【问题讨论】:

  • 您的实施有什么问题?如果有更好的方法,Java 不是很好,所以 IDK,但这似乎是合理的。
  • “有问题”不是有用的问题描述。此外,尚不清楚“数据库列表”应该是什么意思。而且你没有定义“共同元素”;您的代码只比较名称字符串,所以“等名”是否旨在定义“公共元素”?

标签: java arraylist collections java-8


【解决方案1】:

覆盖equals & hashCode

您需要在 VarList 类中定义 overridesequalshashcode 方法。您的类从Object 继承这些方法。

另外,请多考虑命名事物。 VarList 类不是列表,它是列表中的一个元素。当然,它有一个实际的描述性名称。您声明的第二个ArrayList 名为“对象”?!?请永远不要将事物命名为对象。叫它 testList 什么的。

最后,您的System.outresultList 循环内,因此它的输出可能会让您感到困惑。或者也许这是故意的。只要意识到它将为resultList 中的每个元素输出一次。

【讨论】:

    【解决方案2】:

    您可以使用 Collection 类的retainAll(list) method,而不是实现自己的 for 循环来比较 2 个 ArrayList 的元素。

    这里是示例用法:

    SimplePojo.java

    import java.util.Objects;
    
    public class SimplePojo {
    
      private String name;
      private int age;
    
      public SimplePojo(String name, int age) {
        this.name = name;
        this.age = age;
      }
    
      public String getName() {
        return name;
      }
    
      public void setName(String name) {
        this.name = name;
      }
    
      public int getAge() {
        return age;
      }
    
      public void setAge(int age) {
        this.age = age;
      }
    
      @Override
      public String toString() {
        return "SimplePojo{" + "name='" + name + '\'' + ", age=" + age + '}';
      }
    
      @Override
      public boolean equals(Object o) {
        if (this == o) {
          return true;
        }
        if (o == null || getClass() != o.getClass()) {
          return false;
        }
        SimplePojo that = (SimplePojo) o;
        return age == that.age && Objects.equals(name, that.name);
      }
    
      @Override
      public int hashCode() {
        return Objects.hash(name, age);
      }
    }
    

    客户端.java

    import java.util.ArrayList;
    import java.util.List;
    
    public class ListCommonElements {
    
      public static void main(String[] args) {
        List<SimplePojo> list1 = new ArrayList<>();
        list1.add(new SimplePojo("Dave",49));
        list1.add(new SimplePojo("Smith",40));
        list1.add(new SimplePojo("Johnson",32));
        
        System.out.println("List 1: " +list1.toString());
    
        List<SimplePojo> list2 = new ArrayList<>();
        list2.add(new SimplePojo("Dave",49));
        list2.add(new SimplePojo("Smith",40));
        list2.add(new SimplePojo("Steve",32));
        
        System.out.println("List2: "+list2.toString());
    
        list1.retainAll(list2);
    
        System.out.println("Common ELements: " + list1.toString());
      }
    }
    

    注意我如何覆盖 equalshashCode 方法(如果使用 IntelliJ,您可以自动生成它)。

    这样做的原因是你的列表不是原始类型,所以你需要告诉你 equal 对你意味着什么(这样你就可以获得公共元素)并且在当前的实现中,我是说如果 name 和年龄相同,那么只有我会称 2 个对象相等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 2021-01-01
      • 2017-05-26
      • 2022-10-04
      • 2013-08-28
      相关资源
      最近更新 更多