假设我有两种类型:
case class X(i: Int)
case class Y(j: Int)
X
代表Y
s的某些聚合(但我已经丢失了关于哪个Y
组成给定X
的确切信息。我想计算一些有效的聚合:
def aggregate(xs: List[X], ys: List[Y]): Map[X, List[Y]] = {
require(xs.nonEmpty)
require(ys.nonEmpty)
require(xs.count <= ys.count)
require(xs.map(_.i).sum == ys.map(_.j).sum)
lazy val result: List[X, List[Y]] = sys.error("todo: implement me!")
assert(result forall { case (x, ys) => x.i == ys.map(_.j).sum })
//assume an assertion that each input x and y appears exactly once in the result
result
}
显然一般情况下这是不可能的;例如,这里可能没有有效的结果:
aggregate(List(X(1), X(3)), List(Y(2), Y(2))
但对于我的用例,我知道我的方法不能用不可聚合的值调用。
编辑:我将添加对实际情况的解释。基本上我有两个交易来源,其中一个可以任意汇总。也就是说,从一个来源,我可能会看到2个交易的数量都是1,而从另一个来源我可能只看到一个数量为2的交易。我试图将交易来源编织在一起,以便结果Map
说“这个2的总交易实际上由两个1的交易组成”