包含对象的两个列表的并集

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 覆盖 equalshashCode 以避免重复。

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);

https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/CollectionUtils.html#union(java.lang.Iterable,%20java.lang.Iterable)