如何比较 Java 中具有 3 个或更多变量(字段)的对象列表

How to compare lists of objects with 3 or more variables(fields) in Java

我有 3 个字段用于定义唯一对象,例如:区域、名称、平台,它们是字符串值。 必须将此类对象的列表与此类对象的另一个列表进行比较。我正在考虑为此创建一个对象,例如

Class myObject{    
  private String region;    
  private String name;    
  private String platform;    
}

然后创建一个列表来比较两个列表中的每个对象。有人请为我提供更好的解决方案。

我有两个 table 列,id、region、platform、name、zone、count 等,值在这个 table 中重复。另一个table有id,region,platform,name zone。第一个 table 给出了保留的 AWS EC2 实例列表,第二个 table 给出了现在 运行 的 AWS EC2 实例列表。我需要查明所有保留实例当前是否 运行 或是否有任何未使用的实例。

任何人都可以为这个问题提出一个好的解决方案。

您需要使用 equals()hashCode() 方法扩展 class 定义。

请参阅以下文章:Equality on artima.com & Java Equals & HashCode on ideyatech.com。 Google 还有更多。

然后您可以使用 Set 或使用 equals 遍历列表作为测试来帮助生成唯一对象的集合。

要检查两个对象是否相等,您需要覆盖 equals() 并且还应该覆盖 hashCode()。可以找到更多详细信息:here

下面是一个示例 class MyClazz 和一个测试 MyClazzTest 来帮助您理解:

MyClazz

package com.my.test;

public class MyClazz {

    private String region;
    private String name;
    private String platform;

    public MyClazz(String region, String name, String platform) {
        this.region = region;
        this.name = name;
        this.platform = platform;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result
                + ((platform == null) ? 0 : platform.hashCode());
        result = prime * result + ((region == null) ? 0 : region.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        MyClazz other = (MyClazz) obj;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        if (platform == null) {
            if (other.platform != null)
                return false;
        } else if (!platform.equals(other.platform))
            return false;
        if (region == null) {
            if (other.region != null)
                return false;
        } else if (!region.equals(other.region))
            return false;
        return true;
    }
}

MyClazzTest

package com.my.test;

import org.junit.Assert;
import org.junit.Test;

public class MyClazzTest {

    @Test
    public void equalObject() {
        MyClazz object = new MyClazz("UK", "Chris", "Window");
        MyClazz duplicateObject = new MyClazz("UK", "Chris", "Window");
        Assert.assertTrue(object.equals(duplicateObject));
    }

    @Test
    public void notEqualObject() {
        MyClazz object = new MyClazz("UK", "Chris", "Window");
        MyClazz differentObject = new MyClazz("US", "Chris", "Window");
        Assert.assertFalse(object.equals(differentObject));
    }
}

编辑后的问题:

  1. 创建一个包含所有字段的 POJO Class,代表一个复合键。
  2. 为其实现 equals 和 hashCode 方法。
  3. 创建 2 个 POJO 集合,用表中的数据填充它们。
  4. 使用CollectionUtils of ApacheCommons to play with your collections. E.g.: CollectionUtils#isSubCollection
  5. 的方法之一