анализ данных scala, группировка по перекрывающемуся интервалу с использованием чистого scala - PullRequest
0 голосов
/ 13 октября 2019

У меня есть класс дел для хранения данных: case class A (x: String, y: String, a: Int, b: Int)

Теперь данные представляют собой список классов дел List(A(x1, y1, a1, a2), A(x1, y2, a2, b2), ..., A(xn, yn, an, bn)), где A1, A2, A3 - разные экземпляры классов дел.

Теперь мне нужно сгруппировать данные, если записи находятся в перекрывающемся интервале, определяемом (a, b).

Так что, если различные записи похожи на

List(
  A(x0, y1, 1, 5), 
  A(x0, y2, 3, 8), 
  A(x0, y3, 7, 10), 
  A(x0, y4, 12,15), 
  A(x1, y5, 1, 8), 
  A(x2, y6, 2, 7), ...)

, окончательная группировка будетосновываться на классе дела B: case class B (x: String, y:List(String), a:Int, b: Int)

вывод: List(B(x0, List(y1, y2, y3), 1, 10), B(x0, List(y4), 12, 15), B(x1, List(y5,y6), 1, 8), ...)

1 Ответ

0 голосов
/ 13 октября 2019

Это может быть одним из возможных решений с использованием Mutable Map.

case class A(x: String, y: String, a: Int, b: Int)
case class B(x: String, y: List[String], a: Int, b: Int)

val input = List(
  A("x0", "y1", 1, 5),
  A("x0", "y2", 3, 8),
  A("x0", "y3", 7, 10),
  A("x0", "y4", 12, 15),
  A("x1", "y5", 1, 8),
  A("x2", "y6", 2, 7))

val temp = scala.collection.mutable.Map[String, B]()

input.map(data => {
  if (temp.contains(data.x)) {
    val _B = temp(data.x)
    val updatedList = _B.y ++ List(data.y)
    //TODO:
    //Range for a & b
    val a = data.a
    val b = data.b
    temp += (data.x -> B(data.x, updatedList, a, b))
  } else {
    temp += (data.x -> B(data.x, List(data.y), data.a, data.b))
  }
})
val output = temp.values.toList
println(output)
//List(B(x2,List(y6),2,7), B(x1,List(y5),1,8), B(x0,List(y1, y2, y3, y4),12,15))
...