比较列表以检查它们是否具有部分匹配项的最标准(/简洁)方法是什么?
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
}
假设我有一个案例 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
}