如何在Java中将对象列表与3个或更多变量(字段)进行比较

时间:2015-06-01 10:55:20

标签: java list collections compare

我有3个用于定义唯一对象的字段,例如:region,name,platform是字符串值。 必须将此类对象的列表与此类对象的另一列表进行比较。我正在考虑为此创建一个对象,例如

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

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

我有两个表,包括列,id,区域,平台,名称,区域,计数等,并且值在此表中重复。另一个表有id,region,platform,name zone。第一个表给出了保留的AWS EC2实例列表,第二个表列出了现在运行的AWS EC2实例列表。我需要找出所有保留的实例当前是否正在运行还是有任何未使用的实例。

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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

以下是一个示例课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));
    }
}

答案 2 :(得分:0)

编辑问题:

  1. 使用所有字段创建一个POJO类,表示一个复合键。
  2. 为它实现equals和hashCode方法。
  3. 创建2个POJO集合,用表格中的数据填充它们。
  4. 使用CollectionUtils of ApacheCommons的其中一种方法来播放您的收藏。例如:CollectionUtils#isSubCollection