2013-09-24 3 views
0

다시 스칼라와 키/값 쌍 아이디어가 붙어 있습니다. 다시 한 번, Option을 어떤 식 으로든 사용하고 싶습니다. 이번에는 그 키를 기반으로 한 쌍을 제거하는 방법과 그 키의 첫 번째 인스턴스 만 제거하는 방법에 중점을두고 있습니다. 나는 filterfilterNot을 사용하려고 시도했으나 동일한 쌍의 모든 키를 제거합니다. 또한 다시 구현하기 위해 List을 반쯤 간단하게 유지하려고 시도합니다.스칼라 : 목록에서 키/값 쌍을 제거합니다.

+0

"첫 번째"는 _functional_이 아닌 _procedural_로 실행 순서에 의존합니다. –

+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) : 옵션 [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이됩니다.

관련 문제