gpt4 book ai didi

algorithm - Scala:比较一个巨大列表中的所有元素

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:32:22 25 4
gpt4 key购买 nike

请就在 Scala 中比较长列表中的元素的算法和实现提出建议。我有一个包含数千个字符串的列表(来自 SQL),我需要将每个列表元素与该列表中的所有其他元素进行比较。

因此我需要得到一个元组列表:List[(String, String, Boolean)] 其中前两个元素是要匹配的字符串,第三个是结果。

到目前为止,对于 N 个元素的列表,我的算法如下:

  1. 领头羊
  2. 将head与列表中剩余的N-1个元素进行比较
  3. 从旧列表的尾部创建新列表,并使用这个包含 N -1 个元素的新列表完成上述所有工作:

代码:

   /**
* Compare head of the list with each remaining element in this list
*/
def cmpel(
fst: String, lst: List[String],
result: List[(String, String, Boolean)]): List[(String, String, Boolean)] = {

lst match {
case next :: tail => cmpel(fst, tail, (fst, next, fst == next) :: result)
case nill => result.reverse
}
}

/**
* Compare list elements in all combinations of two
*/
def cmpAll(lst: List[String],
result: List[(String, String, Boolean)]): List[(String, String, Boolean)] = {
lst match {
case head :: tail => cmpAll(tail, result ++ cmpel(head, tail, List()))
case nill => result
}
}

def main(args: Array[String]): Unit = {
val lst = List[String]("a", "b", "b", "a")
println(cmpAll(lst, List()))
}

结果:

 List((a,b,false), (a,b,false), (a,a,true), (b,b,true), (b,a,false), (b,a,false))

谢谢!

最佳答案

您可以使用tailsflatMap 方法来编写更简洁和惯用的解决方案:

list.tails.flatMap {
case x :: rest => rest.map { y =>
(x, y, x == y)
}
case _ => List()
}.toList

tails 方法返回一个迭代器,该迭代器迭代 .tail 到列表的重复应用。迭代器中的第一个元素是列表本身,然后是列表的尾部,依此类推,最后返回空列表。

关于algorithm - Scala:比较一个巨大列表中的所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24596293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com