Обнаружение действительной агрегации из двух коллекций, одна из которых является агрегацией другой - PullRequest
2 голосов
/ 29 декабря 2011

Предположим, у меня есть два типа:

case class X(i: Int) 
case class Y(j: Int)

И X s представляют некоторую агрегацию Y s (но я потерял информацию относительно того, какие именно Y s составили данное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»

...