2015-08-14 42 views
1

迭代的一側我想僅除去少數最後的元件的List(或Seq),和避免解析所有元件(以及避免應用所述濾波函數到所有的他們)。濾波只列表/在階

比方說,例如,我有值的隨機嚴格遞增列表:

import scala.util.Random.nextInt 
val r = (1 to 100).map(_ => nextInt(10)+1).scanLeft(0)(_+_) 

而且我想刪除的元素大於,比如說,300我能做到這樣的:

r.filter(_<300) 

但這種方法解析整個列表。那麼,是否有可能僅在一端過濾列表?像filterRight方法的東西?

子問題:

  • 此外,將它的值列表不嚴格增加可能嗎?即刪除從列表的末尾元素,直到一個元素,比如說,低於300
  • ,如果它是不可能的List/Seq,那IndexedSeqVectorArray

解決方案

我選擇了@elm解決方案,因爲它回答了一般列表的子問題,而不僅僅是(嚴格)增加的。 然而,@dcastro的解決方案看起來更加有效,因爲它不會做2個倒檔

回答

2

首先要注意SI-4247dropWhile但沒有dropRightWhile

雖然,一個簡單的實現,傳達想要表達的語義,

def dropRightWhile[A](xs: Seq[A], p: A => Boolean) = 
    xs.reverse.dropWhile(p).reverse 

或等價

implicit class OpsSeq[A](val xs: Seq[A]) extends AnyVal { 
    def dropRightWhile(p: A => Boolean) = xs.reverse.dropWhile(p).reverse 
} 
2

你正在尋找的東西像dropRightWhile,這並不在標準庫中存在( but has been requested before)。

我認爲最好的方法是:

r.takeWhile(_<300) 

因爲它是一個增加值的列表,你可以停止進行任何檢查,當你第一次遇到一個元素大於300