list - 找到重复项时拆分列表 scala

标签 list scala split duplicates

我在 Scala 中有一个元素列表,我正在寻找一种在找到重复项时拆分列表的方法。

例如:List(x,y,z,e,r,y,g,a)将转换为 List(List(x,y,z,e,r),List(y,g,a))List(x,y,z,x,y,z)List(x,y,z), List(x,y,z)List(x,y,z,y,g,x)List(x,y,z), List(y,g,x)
有没有比分别对每个元素进行迭代和检查更有效的方法?

最佳答案

此解决方案有一些注意事项:

  • 我不是在声称“性能”,尽管我认为它比 O(n^2) 更好,这是蛮力。
  • 这是假设您在找到重复项时进行拆分,其中“重复”表示“存在于前一个拆分中的内容”。我只检查了最后一段,就作弊了一点。原因是我认为它阐明了如何使用 foldLeft 一点,这是解决此问题的自然方式。
  • 这里的一切都颠倒了,但保持秩序。这可以很容易地纠正,但增加了一个额外的 O(n) (累积)调用,并且实际上可能不需要(取决于你用它做什么)。

  • 这是代码:
    def partition(ls: List[String]): List[ListSet[String]] = {
      ls.foldLeft(List(ListSet.empty[String]))((partitionedLists, elem:String) => {
        if(partitionedLists.head.contains(elem)) {
          ListSet(elem) :: partitionedLists
        } else {
          (partitionedLists.head + elem) :: partitionedLists.tail
        }
      })
    }
    
    partition(List("x","y","z","e","r","y","g","a"))
    // res0: List[scala.collection.immutable.ListSet[String]] = List(ListSet(r, e, z, y, x), ListSet(a, g, y))
    

    我正在使用 ListSet获得 Set 的双重好处和订购,这适合您的用例。
    foldLeft是一个函数,它接受一个累加器值(在本例中为 List(ListSet.empty[String]) )并在它通过您的集合元素时对其进行修改。如果我们像这里所做的那样将累加器构造为段列表,那么到我们完成时,它将拥有原始列表的所有有序段。

    关于list - 找到重复项时拆分列表 scala,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39255646/

    相关文章:

    python - 如何使用字典查找替换列表中的元素

    r - 对列表中数据框中的每个嵌套数据框应用函数

    java - Scala "pimpers"的良好命名约定

    scala - 在 Scala 中将可变数量的元组序列减少到 Map[Key, List[Value]]

    Javascript 选择保存 split() 的一个索引

    c# - 如何拆分字节数组

    java - 使用 ArrayList<ArrayList<String>>() 时 java 中出现意外输出

    python - 如何合并多个列表?

    scala - 如何从 Play 中的每个请求记录正文?

    java - 在字符串中每隔 ""之前或 160 个字符处插入 <SPLIT>