繁体   English   中英

Scala:比较庞大列表中的所有元素

[英]Scala: Compare all elements in a huge list

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

结果,我需要获取一个元组List[(String, String, Boolean)]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重复应用迭代到列表中。 迭代器中的第一个元素是列表本身,然后是列表的尾部,依此类推,最后返回空列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM