我有两个列表
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;
}
请让我知道合并列表的正确有效的方法。或使用其他收藏夹就可以实现。
答案 0 :(得分:3)
您可以使用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
方法那样进行比较。
答案 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)
如果您愿意使用外部库,也可以使用apache commons集合
ListUtils.union(listA , listB);