检查自定义序列中是否存在特定的键/值

时间:2019-01-16 02:06:43

标签: scala

我现在就如何使它工作感到困惑。

我有一个案例类,例如:

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?的新序列?

1 个答案:

答案 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))