2017-04-24 4 views
-1

Ich habe eine Beispieldatei (Registerkarte getrennt), ich muss lineare Rekursion verwenden, um die Baumliste für einen bestimmten Zustand zu suchen.Scalaliste Suche rekursiv

Eingabedatei:

Quercus acerifolia mapleleaf oak MN 
    Quercus _acutidens  CA 
    Quercus acutissima sawtooth oak AL,GA,LA,MD,MS,NC,PA,VA 
    Quercus agrifolia California live oak CA 
    Quercus alba white oak AL,AR,CT,DC,DE,FL,GA,IA,IL,IN,KS,KY,LA 
    Quercus ajdfensis Ajo Mountain scrub oak ,MN 

    First Column - Tree Name(Genus Species) 
    Second Column - Common Tree name 
    Third Column - State Name 

-Code mit Rekursion:

//declaring package 
    package HW10 

    //declaring object 
    object TreesStub { 

    //importing Source package for files import 
     import scala.io.Source 

     //assigning the file path to filename variable 
     val fileName = "trees.tsv" //tab separated 

     //defining Main function 
     def main(args: Array[String]): Unit = { 

     //reading source file from a file which is tabe separated 
     val treeList: List[String] = Source.fromFile(fileName).getLines.toList 

     //Creating mutable list to append element which found a match 
     var stateList = collection.mutable.ListBuffer[String]:() 

     //Checking the list if empty then print empty list else call the function 
     if(treeList.isEmpty) println("Empty List") 
     else searchTreesRecursively(state,treeList) //calling recurive func 

     //Calling recursive function search trees using "state" name and each line of //file(as second parameter)  
     def searchTreesRecursively(state: String, trees: List[String]): Unit = { 
    //matching the trees list 
     trees match { 
      case Nil => println(stateList) //If empty print the entire list 

      //taking each line and splitting the lines using and matching with the state //given  

      case x => x.map(x => (x.split("\t", -1))).filter(_.length > 2).map(x1=> if(x1(2).contains(state)) stateList+= x(0) 

      //calling function recursively for the rest of the elements of the list 
      else searchTreesRecursively(state,x1->next)}//next //element of list 

     } 
     } 

    } 

Hier bin ich versucht, die rekursive Funktion für jedes Element der Liste "x1" in case-Anweisung zu nennen. Ich bin nicht sicher, wie man das zweite Element der Liste durch recursion aufruft, das ich "searchTreesRecursively (Zustand, x1-> nächstes)"} benutzte, aber ich erhalte Störung als "Art Mismatch".

I know we can use x::xs for iterating the list, but i am not sure how i can use it to fit in this logic. Please let me know. 
+0

'x1-> next' ist ein Lambda, kein' Liste [Zeichenfolge] '. Sie müssen 'x1.next' verwenden, denke ich. Oder vielleicht sogar 'trees.tail'? Wo ist 'x1' definiert? – marstran

+0

Ich habe die x1.next auch, aber hat nicht funktioniert. x1 ist das Element in der Funktion "map". Hier ist die Codezeile: - map (x1 => {if (x1 (2) .enthält (state)) stateList + = x (0) else searchTreesRecursively (state, x1.next)})} – Issaq

+0

'x1-> next' ist kein Lambda, es ist ein Tupel, aber es gibt keinen Wert für die nächste, ich nehme an, Sie möchten den Schwanz der Liste mit .tail bekommen, aber warum mappen Sie über die gesamte Liste Zeit? –

Antwort

0

Das Problem mit dem Muster in diesem Musterabgleich ist,

So ... eine Liste in Scala kann gedacht werden so etwas wie,

list = elem1 :: elem2 :: elem3 :: Nil 

oder seine

list = elem1 :: (elem2 :: (elem3 :: (Nil))) 

oder,

list = elem1 :: tail1 

wo

tail1 = (elem2 :: (elem3 :: (Nil))) 

So können, wenn Sie sagen rekursiv abcdef tun auf Elemente dieser Liste wollen,

def abcdef(list: List[String]): Unit = { 
    case Nil => println("nil") 
    case head :: tail => { 
    println(head) 
    abcdef(tail) 
    } 
} 
+0

Ich treid das: - def searchTreesRecursively (state : String, Bäume: List [String]): Unit = { val list1 = trees.map (x => (x.split ("\ t", -1))). Filter (_. Length> 2). toList list1 Übereinstimmung { Fall Nil => println (stateList) Fall x :: xs => {if (x (2) == Zustand) stateList + = x (0) sonst xs.map (_ => searchTreesRecursively (state , _))}}} Noch zeigt es Fehler als "Fehler: (53, 108) fehlender Parametertyp für erweiterte Funktion ((x $ 4) => searchTreesRecursively (state, x $ 4)) case x :: xs => {if (x (2) == Zustand) stateList + = x (0) – Issaq