scala - scala数据分析,使用纯scala通过重叠间隔进行分组
问题描述
我有一个用于存储数据的案例类:
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), ...)
解决方案
这可能是一种可能的解决方案,使用可变映射。
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))
推荐阅读
- java - 没有静态方法 encodeBase64String([B)Ljava/lang/String; 在 Lorg/apache/commons/codec/binary/Base64 类中;或其超类
- c - 如何在 _start 中使用 argv?
- c# - 来自 API 的 JsonConvert.DeserializeObject 对象,使用 Webclient 可能是 2 种对象类型之一
- python - 如何让程序在 Python 中完成后重新运行
- html - 全新的 CSS,无法弄清楚如何为我的每个 html 段落正确编码不同的类/属性值
- django-rest-framework - 类型错误:+= 不支持的操作数类型:“datetime.timedelta”和“NoneType”
- html - 如何使 html 灯箱响应?
- google-apps-script - Google脚本仅使用值和格式复制工作表
- html - 如何在引导程序 4 中创建响应式布局
- git - 推送到 GitHub 时远程挂断