我刚刚有一个用例,我需要将列表拆分为n个子列表,以便元素按原始列表的顺序进行分组,而谓词对于子列表(当它为假时,启动一个新的子列表)。我没有在标准库中找到这个功能,我认为这是一个很好的练习,试图以功能性的风格来解决它(因为我远离功能大师)。Scala:使用子列表的谓词拆分列表
下面是我想出的代码。但我怀疑它可以提高很多。你能帮我找到更好的方法来编码吗?
class ListWithSplitter[A](val theList:List[A])
{
private def sublistWhile(list:List[A], pred:(List[A] => Boolean)):(List[A],List[A]) =
{
def combine(okList:List[A], remaining:List[A], pred:(List[A] => Boolean)):(List[A],List[A]) =
{
if(pred(okList ::: remaining.head :: Nil))
combine(okList ::: remaining.head :: Nil, remaining.tail, pred)
else
(okList, remaining)
}
list match {
case Nil => (Nil, Nil)
case x :: Nil => (list, Nil)
case x :: xs => combine(List(x), xs, pred)
}
}
private def combinedSplit(list:List[A], pred:(List[A] => Boolean)):List[List[A]] =
{
val r = sublistWhile(list, pred)
r match {
case (Nil, Nil) => List(Nil)
case (x, Nil) => List(x)
case (x, y) => x :: combinedSplit(y, pred)
}
}
def combinedSplit(pred:(List[A] => Boolean)):List[List[A]] =
{
combinedSplit(theList, pred)
}
}
trait ListCombinedSplit
{
implicit def list2combSplitter[A](x:List[A]) : ListWithSplitter[A] = new ListWithSplitter(x)
}
object ListSplitter extends ListCombinedSplit {
def main(args:Array[String])
{
// sample usage: sum of each sublist is less than 100
val a = List(4, 59, 10, 24, 42, 9, 2, 44, 44, 44, 44)
val b = a combinedSplit { list:List[Int] => ((0 /: list)(_ + _)) < 100 }
b foreach println
}
}
结果的样品是:
List(4, 59, 10, 24)
List(42, 9, 2, 44)
List(44, 44)
List(44)
谢谢......不像我打算的一般,但会为我的用例做! – 2009-03-02 02:37:32