是否有通过检查每个 Array[Int] 的每个元素来选择 List[Array[Int]] 子集的 Scala 方式?
Posted
技术标签:
【中文标题】是否有通过检查每个 Array[Int] 的每个元素来选择 List[Array[Int]] 子集的 Scala 方式?【英文标题】:Is there a Scala way of selecting a subset of List[Array[Int]] by checking each element of each Array[Int]? 【发布时间】:2022-01-10 18:50:46 【问题描述】:Scala 新手。我有 List[Array[Int]] 形式的数据,每个 Array[Int] 有 n 个整数,称之为 a。还有两个 Array[int],分别称为 c 和 d,长度也为 n。我想将 a 的每一行的每个元素与 c 和 d 的相应元素(即相同索引)进行比较,并返回与 c 或 d 匹配的那些行。
这里没什么利害关系,只是自学 Scala。
【问题讨论】:
首先,您的标题在标题中显示List[List[Int]]
,然后您开始谈论数组。它们是非常不同的类型,以至于相等机制实际上对两者的工作方式不同。你能澄清一下你的实际类型吗?然后你的标题说你想检查列表的第一个元素只是继续说你想比较每一行的每个元素。这不加起来。请相应地修改问题
没关系。尝试不同的方法没有任何意义。事实上,这是鼓励 :) 如果保证它们的长度相同,那么您只是希望过滤等于 c
或 d
的行。在这种情况下,如果我没有遗漏任何类似x.filter(a => a.sameElements(c) || a.sameElements(d))
的东西应该可以工作。您可以在docs 中阅读有关filter
的信息
我建议使用List
、Vector
或ArraySeq
而不是普通的Arrays
路易斯的评论+1。另外我想邀请您加入Scala discord。它更适合扩展讨论。 *** 更适合打开和关闭的答案。在任何情况下,文档应该始终是您在提出问题之前检查的第一件事。他们经常有答案
@Tico 最好在不和谐服务器中重新提出该问题并尝试更清楚,添加示例会有所帮助。
【参考方案1】:
假设这个起点:
val c = Array(1,2,3)
val d = Array(0,1,2)
val target: List[Array[Int]] = List(c,d)
val as: List[Array[Int]] =
List(
Array(0,1,2),
Array(1,2,3),
Array(2,3,4),
Array(4,5,6),
)
这里是如何只从as
中获取与c
或d
完全匹配的数组:
as
.filter(a => a.sameElements(c) || a.sameElements(d))
//and a bit more generic if you have a big target pool
as
.filter(a => target.exists(_.sameElements(a)))
此解决方案对as
中可能的空数组或不同大小的数组具有弹性。
【讨论】:
【参考方案2】:解决这个问题有不同的方法,可能的方法是使用.zip
例如:
val a = List(Array(1,1,1), Array(2,2,2), Array(3,3,3))
val c = Array(2,2,2)
val res = a.map(arr => arr.zip(c))
在 res 中你会得到类似的东西
/*
List[Array[Tuple2[Int, Int]]] = List(
Array((1, 2), (1, 2), (1, 2)),
Array((2, 2), (2, 2), (2, 2)),
Array((3, 2), (3, 2), (3, 2))
)
*
使用这种结构很容易比较每个元素,例如
res.map(arr => arr.map(e => e._1 == e._2))
/*
res1: List[Array[Boolean]] = List(
Array(false, false, false),
Array(true, true, true),
Array(false, false, false)
)
*/
【讨论】:
以上是关于是否有通过检查每个 Array[Int] 的每个元素来选择 List[Array[Int]] 子集的 Scala 方式?的主要内容,如果未能解决你的问题,请参考以下文章