比较列表以检查它们是否具有部分匹配项的最标准(/简洁)方法是什么?

What is the most standard(/concise) way to compare the lists to check whether they have partial matches?

假设我有一个案例 class 如下所示

case class CaseClassX(a: String, b: Int, c: Boolean)

和包含这种情况的两个相同长度的列表 class。

比较列表以检查它们是否有部分匹配的最标准(/简洁)方法是什么? (假设列表已排序)

即 只比较b和c,不比较a

成功案例:

  Seq(
    CaseClassX("some text1", 1, true),
    CaseClassX("some text2", 2, false),
    CaseClassX("some text3", 3, true)
  )

以上应符合以下

 Seq(
    CaseClassX("some text4", 1, true),
    CaseClassX("some text5", 2, false),
    CaseClassX("some text6", 3, true)
  )

失败案例:

  Seq(
    CaseClassX("some text1", 1, true),
    CaseClassX("some text2", 2, false),
    CaseClassX("some text3", 3, true)
  )

以上不符合以下

 Seq(
    CaseClassX("some text4", 1, true),
    CaseClassX("some text5", 2, true),
    CaseClassX("some text6", 3, true)
  )

我想像下面这样编写一个通用方法:

// this is good practice
import scala.collection.immutable.Seq

def matches[A, B](xs: Seq[A], ys: Seq[B])(comparer: (A, B) => Boolean): Boolean = xs.zip(ys).forall { case (x, y) => comparer(x, y) }

case class CaseClassX(a: String, b: Int, c: Boolean)

val xs = List(CaseClassX("hi", 42, false), CaseClassX("hello", 1, true)
val ys = List(CaseClassX("hi", 42, true), CaseClassX("hello", 1, false))

matches(xs, ys)((x, y) => x.a == y.a && x.b == y.b) //true
matches(xs, ys)((x, y) => x.a == y.c && x.c == y.c) //false

我对其进行了编辑,使其更加通用。不需要将第二个参数限制为 Seq[A] 所以我添加了另一个类型参数并使其成为 Seq[B].

你可以 zip 两个序列然后只使用 forall:

def partialMatch(seq1: Seq[CaseClassX], seq2: Seq[CaseClassX]): Boolean = (seq1, seq2)
  .zipped
  .forall {
     case (CaseClassX(_, b1, c1),CaseClassX(_, b2, c2)) => b1 == b2 && c1 == c2
  }