2013-09-24 92 views
0

再次,我堅持Scala和鍵/值對的想法。再次,我想以某種方式使用Option。這一次,我被困在如何基於密鑰刪除一對,並且只有該密鑰的第一個實例(並非全部)。我試圖使用filterfilterNot,但刪除所有共享相同的密鑰對。此外,再次試圖用List來實現這一點,以使其保持半簡單Scala:從列表中刪除鍵/值對

+0

依賴於執行順序&「第一」聽起來_procedural_而不是_functional_,有點。 –

+0

由於這看起來像家庭作業,並且您希望在使用'List'的同時儘可能地發揮功能,所以我將指向'List'的'span'函數。想想你如何分解它返回的元組(頭部,尾部)以及你可以用它們做什麼。 – yan

+0

@ThomasW沒有。 'List'是一個有序的結構,所以就結構而言,「first」是很好的定義,而不考慮添加/訪問項目的執行順序。 –

回答

0

很難說出你在問什麼。如果你寫出你正在編寫的函數的簽名,這將有所幫助。

可能是這樣的嗎?

def remove[A, B](seq: Seq[(A, B)], key: A): Seq[(A, B)] = 
    seq.indexWhere(_._1 == key) match { 
    case -1 => seq 
    case n => seq.patch(n, Nil, 1) 
    } 

remove(Seq((1,2), (2,3), (3,4), (2,5)), 2) 
// List((1,2), (3,4), (2,5)) 

remove(Seq((1,2), (2,3), (3,4), (2,5)), 6) 
// List((1,2), (2,3), (3,4), (2,5)) 
+0

對不起,我忘了添加它了。「def remove(key:String):Option [Any]」是我試圖做的那個 – JrPtn

+0

嗯...... List在哪裏起作用? –

+0

該列表是我在別處定義的內容。示例列表((「A」,1),(「B」,2),(「C」,3))其中字母是「鍵」,數字是「值」。 – JrPtn

0

Seq has a method called find,做你問什麼:

 
def find(p: (A) ⇒ Boolean): Option[A] 

Finds the first element of the sequence satisfying a predicate, if any. 

Note: may not terminate for infinite-sized collections. 

    p   the predicate used to test elements. 

    returns  an option value containing the first element in the 
       sequence that satisfies p, or None if none exists. 

用法:

val list = List(("A",1),("B",2),("C",3)) 

def remove(key:String): Option[Int] = list.find(_._1 == key) 

remove("B") 
// Some((B,2)) 

remove("D") 
// None 
0
val list = List(1 -> 'a, 2 -> 'b, 2 -> 'c) 

val removal = list find (_._1 == 2) 
    // Option[(Int, Symbol)] = Some((2,'b)) 
val newList = list diff removal.toList 
    // List[(Int, Symbol)] = List((1,'a), (2,'c)) 

diff將刪除只在參數中找到的每個元素的第一個實例列表中,並不全是filter