我现在就如何使它工作感到困惑。
我有一个案例类,例如:
case class Visitors(start: Int, end: Int, visitor_num: Int)
现在说我创建两个单独的访客类型序列:
val visitors_A = Seq(Visitors(start = 1, end = 1, visitor_num = 2),Visitors(start = 2, end = 2, visitor_num = 129),Visitors(start = 3, end = 3, visitor_num = 90))
val visitors_B = Seq(Visitors(start = 1, end = 1, visitor_num = 0),Visitors(start = 2, end = 2, visitor_num = 0))
我想创建一个单独的Visitors Sequences,它将输出一个序列的Visitors Sequences,它们的Visitors_A和Visitors_B的开始时间相同, 输出示例应为:
visitors_Same = Seq(Visitors(start = 1, end = 1, visitor_num = 2),Visitors(start = 2, end = 2, visitor_num = 129)
它应该检查两个序列中是否都存在开始时间,如果有,请从visiters_A中获取序列值并将其附加到列表中。
让我感到困惑的是,我正在使用“自定义”类型的Visitor,并且我似乎无法运行相交或在visitor_b中包含对visitor_a的函数调用,我知道我可能需要检查是否从B中存在A,然后将输出映射(?)到类型为Visitor?的新序列?
答案 0 :(得分:1)
如果您想要一个班轮(但可能效率很低),那就是:
val r1 = visitors_A.filter(va => visitors_B.exists(vb => vb.start == va.start))
如果先将visitors_B
转换为Map
(逻辑上映射为start -> visitor
),则可以提高速度:
val vbm = visitors_B.map(vb => (vb.start, vb)).toMap
val r2 = visitors_A.filter(va => vbm.contains(va.start))
修改
实际上,由于根本没有使用Map
中的值,因此您可以使用Set
来代替Map
,效率会更高:
val vbs = visitors_B.map(vb => vb.start).toSet
val r3 = visitors_A.filter(va => vbs.contains(va.start))