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

时间:2019-04-23 09:01:08

标签: scala scalatest

假设我有一个如下的case类

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

和包含该案例类的两个相同长度的列表。

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

即 仅对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)
  )

2 个答案:

答案 0 :(得分:2)

我会写一个如下的通用方法:

// 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]

答案 1 :(得分:2)

您可以同时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
  }