我有一个表示数据库表中每一行的类。因此它有一些数据成员代表表中的主键,而其他数据成员是非键列。假设我有一个行列表(listA),我在某个时间点获取,然后在一段时间后我获取更多行(listB),其中可以包含先前获取但在非键列中有一些更新数据的行。我想合并listA和listB保留更新的值(即listB中的东西)。此比较仅需要检查关键列。那么有没有任何实用程序(可能在guava或apache commons等)包含/ removeAll方法接受自定义比较功能?
出于所有其他目的,我想检查类中的所有数据成员是否相等。
请注意,通常的removeAll将使用已被覆盖的equals和hashcode来比较类中的每个数据成员,我想使用另一个比较器,该比较器仅比较作为contains的主键的一部分的数据成员。 / p>
答案 0 :(得分:0)
您可以使用标准Java Set操作。如果您的“行”类不实现equals
而hashCode
仅使用 主键信息,则可以使用一些包装器或实用程序类例如:
class Row {
Object pk, a, b;
public boolean equals(Object other) {
// Checks for other's type, etc.
Row otherRow = (Row) other;
return pk.equals(otherRow.pk) && a.equals(otherRow.a) && b.equals(otherRow.b);
}
}
class PkInfo {
final Row row;
PkInfo(Row row) {
this.row = row;
}
Row getRow() {
return row;
}
public boolean equals(Object other) {
// Checks for other's type, etc.
PkInfo otherPkInfo = (PkInfo) other;
return row.pk.equals(otherPkInfo.row.pk);
}
public int hashCode() {
return row.pk.hashCode();
}
}
因此,只要您想合并结果集,就可以执行以下操作:
// Your result sets
Collection<Row> listA, listB;
// Your primary-key-based sets
Set<PkInfo> pkiA = new HashSet<PkInfo>();
for (Row r : listA)
pkiA.add(new PkInfo(r));
Set<PkInfo> pkiB = new HashSet<PkInfo>();
for (Row r : listB)
pkiB.add(new PkInfo(r));
// Remove from A the rows present in B
pkiA.removeAll(pkiB);
// Modify listA
listA = new ...();
for (PkInfo pki : pkiA)
listA.add(pki.getRow());
// Add all from listB
listA.addAll(listB);
您可以将上面的代码放在一个实用程序方法中,只要您想用另一个列表中的新数据更新列表,就可以调用它。
答案 1 :(得分:0)
在你的班级中你只需要@Override公共布尔值equals(Object obj)。这是在测试contains(Object)时List使用的方法。