允许在java中传递不同的比较函数的实用程序方法

时间:2016-03-09 14:10:52

标签: java collections comparison

我有一个表示数据库表中每一行的类。因此它有一些数据成员代表表中的主键,而其他数据成员是非键列。假设我有一个行列表(listA),我在某个时间点获取,然后在一段时间后我获取更多行(listB),其中可以包含先前获取但在非键列中有一些更新数据的行。我想合并listA和listB保留更新的值(即listB中的东西)。此比较仅需要检查关键列。那么有没有任何实用程序(可能在guava或apache commons等)包含/ removeAll方法接受自定义比较功能?
出于所有其他目的,我想检查类中的所有数据成员是否相等。
请注意,通常的removeAll将使用已被覆盖的equals和hashcode来比较类中的每个数据成员,我想使用另一个比较器,该比较器仅比较作为contains的主键的一部分的数据成员。 / p>

2 个答案:

答案 0 :(得分:0)

您可以使用标准Java Set操作。如果您的“行”类实现equalshashCode仅使用 主键信息,则可以使用一些包装器或实用程序类例如:

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使用的方法。