包含对象的两个列表的并集
Union of two lists containing objects
我有两个列表
ListA<TestData> listA = new ArrayList<TestData>()
ListB<TestData> listB = new ArrayList<TestData>()
两者都包含 TestData 类型的对象,而 TestData 包含这些变量。
TestData {
String status;
String billType;
}
我想要两个列表的并集。
ListA = ["ACTV","S"],["DISC","E"];
ListB = ["ACTV","V"],["DISC","E"],["DISC","S"];
UpdatedList = ["ACTV","S"],["DISC","E"],["ACTV","V"],["DISC","S"];
我试过检查以下条件,但它不起作用。
for (TestData myData : ListA) {
if(!ListB.contains(myData))
return true;
}
你能告诉我合并列表的正确有效方法吗?或者这可以通过使用其他一些集合来实现。
您可以使用:
ListA.addAll(ListB);
这会将Collection B上的所有元素添加到A中。但是List是一个允许重复值的接口。
如果你想确保没有重复的项目,你必须在你的 TestData 上覆盖 equals 方法 class 并使用集合(如 HashSet)而不是列表。
题外话,在Java中,变量名以小写开头,参见javacode约定:http://www.oracle.com/technetwork/java/codeconvtoc-136057.html
您可以使用 Set
并让 TestData
覆盖 equals
和 hashCode
以避免重复。
TestData {
String status;
String billType;
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof Testdata)) return false;
TestData other = (TestData) obj;
return status.equals(other.getStatus()) && billType.equals(other.getBillType())
}
public int hashCode() {
int hashcode = 31;
hashcode += 31 * status.length();
hashcode += 31 * billType.length();
return hashcode;
}
}
然后
Set<TestData> data = new HashSet<>();
data.addAll(listA);
data.addAll(listB);
如果你想要一个排序的 TreeSet
然后实现 Comparable
而不是你以与 equals
方法类似的方式进行比较。
您应该覆盖 equals() 方法以使用 contains() 方法。
https://docs.oracle.com/javase/7/docs/api/java/util/List.html#contains%28java.lang.Object%29
您可以在 class 中覆盖 equals() 和 hashCode() 方法,然后放入所有列表设置。
Set<TestData> uniqueElements = new HashSet<>();
uniqueElements.addAll(listA);
uniqueElements.addAll(listB);
如果您可以自由使用外部库,您也可以使用 apache 公共集合
ListUtils.union(listA , listB);
我有两个列表
ListA<TestData> listA = new ArrayList<TestData>()
ListB<TestData> listB = new ArrayList<TestData>()
两者都包含 TestData 类型的对象,而 TestData 包含这些变量。
TestData {
String status;
String billType;
}
我想要两个列表的并集。
ListA = ["ACTV","S"],["DISC","E"];
ListB = ["ACTV","V"],["DISC","E"],["DISC","S"];
UpdatedList = ["ACTV","S"],["DISC","E"],["ACTV","V"],["DISC","S"];
我试过检查以下条件,但它不起作用。
for (TestData myData : ListA) {
if(!ListB.contains(myData))
return true;
}
你能告诉我合并列表的正确有效方法吗?或者这可以通过使用其他一些集合来实现。
您可以使用:
ListA.addAll(ListB);
这会将Collection B上的所有元素添加到A中。但是List是一个允许重复值的接口。
如果你想确保没有重复的项目,你必须在你的 TestData 上覆盖 equals 方法 class 并使用集合(如 HashSet)而不是列表。
题外话,在Java中,变量名以小写开头,参见javacode约定:http://www.oracle.com/technetwork/java/codeconvtoc-136057.html
您可以使用 Set
并让 TestData
覆盖 equals
和 hashCode
以避免重复。
TestData {
String status;
String billType;
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof Testdata)) return false;
TestData other = (TestData) obj;
return status.equals(other.getStatus()) && billType.equals(other.getBillType())
}
public int hashCode() {
int hashcode = 31;
hashcode += 31 * status.length();
hashcode += 31 * billType.length();
return hashcode;
}
}
然后
Set<TestData> data = new HashSet<>();
data.addAll(listA);
data.addAll(listB);
如果你想要一个排序的 TreeSet
然后实现 Comparable
而不是你以与 equals
方法类似的方式进行比较。
您应该覆盖 equals() 方法以使用 contains() 方法。 https://docs.oracle.com/javase/7/docs/api/java/util/List.html#contains%28java.lang.Object%29
您可以在 class 中覆盖 equals() 和 hashCode() 方法,然后放入所有列表设置。
Set<TestData> uniqueElements = new HashSet<>();
uniqueElements.addAll(listA);
uniqueElements.addAll(listB);
如果您可以自由使用外部库,您也可以使用 apache 公共集合
ListUtils.union(listA , listB);