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

Scala 检查自定义序列中是否存在特定的键/值,scala,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

我现在很困惑,不知该如何让它发挥作用

我有一个案例类,例如:

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))
我想创建一个单独的访客序列,该序列将输出一个访客序列,该序列的访客a和访客B的开始时间相同, 输出示例应为:

visitors_Same =  Seq(Visitors(start = 1, end = 1, visitor_num = 2),Visitors(start = 2, end = 2, visitor_num = 129)
它应该检查开始时间是否在两个序列中,如果是,则从访问者_A获取序列值并将其附加到列表中

让我困惑的是,我使用的是一种“自定义”类型的访问者,我似乎无法在访问者b中运行intersect或包含访问者a的函数调用,我知道我可能需要检查b中是否存在来自a的起始值,然后将(?)输出映射到一个新的访问者类型序列?

如果需要一行程序(但可能效率很低)这里是:

val r1 = visitors_A.filter(va => visitors_B.exists(vb => vb.start == va.start))
如果先将
visitors\u B
转换为
Map
(从逻辑上讲,Map是
start->visitor
),则可以获得更快的速度:

编辑

实际上,由于根本不使用
映射中的值,因此可以使用
设置
,这将比
映射
更有效:

val vbs = visitors_B.map(vb => vb.start).toSet
val r3 = visitors_A.filter(va => vbs.contains(va.start))

就是这样,老兄,scala真是太难了。@user3674993,这其实相对容易。我不知道你为什么觉得很难,但你可能应该解决几个类似的训练问题。一行代码的逻辑如下:首先,让我们检查一个固定的
va
,如果它应该在结果。很简单,只要检查
visitors\u B
是否包含具有相同
start
的记录即可。现在,当我们进行此类检查时(又称谓词)只需在
过滤器
调用中使用它。基于
映射
的解决方案是一个加快谓词检查的技巧,它首先构建一个有效的数据结构,可以回答
存在
类的问题。我想这意味着它的逻辑并不困难,但函数内调用函数的实现让我感到困惑有点不对劲。@user3674993,我知道解决这个问题的唯一方法:多积累一点经验。这其实并不难。@user3674993,我建议的一个练习是尝试实现集合API的各种方法(对于
Seq
列表
)使用其他方法。忘记所有关于
隐式
s和映射到不同类型集合的花哨内容,总是返回
列表
是可以的。关键是实际上只有一个非常小的“核心”只有少数几个方法,其他所有方法都可以用它们来实现。例如,您看到的
intersect
可以实现为
filter
+
contains
,但您可以更深入。例如,您可以使用
fold
实现
filter
val vbs = visitors_B.map(vb => vb.start).toSet
val r3 = visitors_A.filter(va => vbs.contains(va.start))