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

时间:2014-07-06 13:24:57

标签: algorithm list scala

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

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

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

  1. 列出清单
  2. 将头部与列表中剩余的N-1个元素进行比较
  3. 从旧列表的尾部创建新列表,并使用这个新的N-1元素列表完成上述所有工作:
  4. 代码:

       /**
       * 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))
    

    谢谢!

1 个答案:

答案 0 :(得分:6)

您可以使用tailsflatMap方法撰写更简洁,惯用的解决方案:

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

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