如何比较 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));
}
}
编辑后的问题:
- 创建一个包含所有字段的 POJO Class,代表一个复合键。
- 为其实现 equals 和 hashCode 方法。
- 创建 2 个 POJO 集合,用表中的数据填充它们。
- 使用CollectionUtils of ApacheCommons to play with your collections. E.g.: CollectionUtils#isSubCollection
的方法之一
我有 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));
}
}
编辑后的问题:
- 创建一个包含所有字段的 POJO Class,代表一个复合键。
- 为其实现 equals 和 hashCode 方法。
- 创建 2 个 POJO 集合,用表中的数据填充它们。
- 使用CollectionUtils of ApacheCommons to play with your collections. E.g.: CollectionUtils#isSubCollection 的方法之一