我在 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/