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

时间:2018-06-27 10:26:47

标签: java collections java-6

我有两个列表

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

请让我知道合并列表的正确有效的方法。或使用其他收藏夹就可以实现。

4 个答案:

答案 0 :(得分:3)

您可以使用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方法那样进行比较。

答案 1 :(得分:2)

您应覆盖 equals()方法,以使用 contains()方法。 https://docs.oracle.com/javase/7/docs/api/java/util/List.html#contains%28java.lang.Object%29

您可以在类中重写 equals() hashCode()方法,然后将所有列表放入Set。

Set<TestData> uniqueElements = new HashSet<>();

uniqueElements.addAll(listA);
uniqueElements.addAll(listB);

答案 2 :(得分:0)

您可以使用:

 ListA.addAll(ListB);

这会将集合B上的所有元素添加到A。但是List是一个允许重复值的接口。

如果要确保没有重复的项目,则必须在TestData类上覆盖equals方法,并使用Sets(例如HashSet)代替Lists。

在主题之外,在Java中,变量名以小写字母开头,请参见Javacode约定:http://www.oracle.com/technetwork/java/codeconvtoc-136057.html

答案 3 :(得分:0)