2016-03-04 155 views
0

我試圖從IntList獲得第一個和最後一個元素。以下是我現在想:斯卡拉匹配列表

def find(lista: List[Integer]) : (Int,Int) = { 
    case (x) => (x,x) 
    case (x1,x2) => (x2,x2) 
    case hd :: _ :: tail => find(tail) 
} 

我正在排隊find(tail)一個警告:

type mismatching found List[Any], required List[Integer] 
+0

什麼是您收到確切的錯誤?它是一個'MatchError'嗎?請相應地更新您的問題。 – Eric

+1

另外,除非這是一個學術練習,爲什麼不嘗試'(lista.head,lista.last)'? – Eric

+0

我知道這是可能的,我只是想不這樣做大聲笑 – miechooy

回答

2

這是因爲你已經錯過了match聲明在你的代碼,即它應該是,

def find(lista: List[Int]): (Int, Int) = lista match { 
    //cases go here 
} 

你也有一些問題提取(唐元組「T比賽List) 因此前幾個case語句應該是,

{ 
    case h :: Nil => (h, h) 
    case h1 :: h2 :: Nil => (h1, h2) 
    ... 
} 

你什麼實際上已經完成在錯過match是由scala轉換成FunctionPartialFunction。輸入類型爲Any的原因是前兩個case語句與元組匹配,而不是List,因此它將類型擴展爲Any

最後的代碼是,

def find(lista: List[Int]) : (Int,Int) = lista match { 
    case h :: Nil => (h, h) 
    case h1 :: h2 :: Nil => (h1, h2) 
    case hd :: _ :: tail => find(tail) 
} 
+0

:) find(List(1,2,3,4))==(3,4); find(List(1,2,3))==(3,3); find(List(1,2))==(1,2) – nikiforo

+0

@nikiforo你是對的 - 我實際上並沒有仔細閱讀剛纔翻譯過的函數的實際點。 – yw3410

2

在這裏你對陣一個元組:

case (x1,x2) => (x2,x2) 

如果你要玩與遞歸和模式匹配,你可以做像這樣做:

object HeadTail{ 
    def find(lista: List[Int]) : (Int,Int) = { 
    @tailrec 
    def getLast(l: List[Int]): Int = l match { 
     case h :: Nil => h 
     case h :: tail => getLast(tail) 
    } 

    lista match { 
     case Nil => throw new IllegalArgumentException("empty list") 
     case h :: tail => (h, getLast(lista)) 
    } 
    } 
} 

這裏它是如何工作:

scala> stackoverflow.q35804673.HeadTail.find(List(1,2,3,4,5)) 
res0: (Int, Int) = (1,5) 

scala> stackoverflow.q35804673.HeadTail.find(List(1,5)) 
res1: (Int, Int) = (1,5) 

scala> stackoverflow.q35804673.HeadTail.find(List(1)) 
res2: (Int, Int) = (1,1) 

scala> stackoverflow.q35804673.HeadTail.find(List.empty) 
java.lang.IllegalArgumentException: empty list