2016-12-11 11 views
0

私は、別のリストのすべての別個の要素からなるリストを返すScalaでこの再帰的metodを作った。Scalaの空リストの先頭

java.util.NoSuchElementException:空のリストの先頭

私はこの例外があったと思った私は、コードをコンパイルしてから、私はそれを実行したときに

object es20 extends App{ 

    def filledList:List[Int]=List() 

    @scala.annotation.tailrec 
    def distinct(l:List[Int]):List[Int] ={ 
     if (l.isEmpty) filledList 
     if (filledList.forall(_!=l.head)) l.head::filledList 

    distinct(l.tail) 
    } 
println(distinct(List(1,1,5,6,6,3,8,3))) //Should print List(1,5,6,3,8) 
} 

しかし、この例外がありますif(l.isEmpty)の条件で処理します。

コードを修正するにはどうすればよいですか?

+1

これは、デバッガでコードをステップ実行することによって簡単に回答できる質問の素晴らしい例です。それをどうやってやるのか分からなければ、学ぶのは良い考えです。それはあなたにとって非常に役に立つでしょう。 –

答えて

3

Scalaメソッドでは、ブロックの最後の式が返されます。あなたの場合、3つの式があります:unitとcallを結果とする2つのif式は、リストが空であるかどうかにかかわらず、distinctを呼び出すたびにチェックが実行されます。

これを修正するには、if/else構造体を使用するか、入力リストでパターンマッチングを行うか、headOptionで操作を行うことができます。このコードが正しい場合

とにかく私は疑問:あなたは、あなたが二ifelseを挿入することにより、この特定のエラーを修正することができ、常に空

0

は「filledList」に何かをチェックしよう。しかし、他の答えに記載されているように、あなたのコードは正しくないとにかく動作しません、あなたはそれを書き直す必要があります。

また、この関数を演習として書くことにしています(そうでなければ、list.distinctを実行します)。しかし、私は、二次的解決法をtrivially linear問題に実装することは、 。

関連する問題