2013-09-24 87 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