2017-04-23 58 views
0

我想在Scala文件中搜索给定状态树的列表。斯卡拉地图不迭代到所有元素

下面是示例文件(制表符分隔): -

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 

我的代码: -

//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" 

    //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 

    //calling searchTrees method for a given State 
    searchTrees("MN", treeList) 

    //searchTrees method logic for a given State and print it 
    def searchTrees(state: String, trees: List[String]): Unit = { 

     //defining mutable empty map collection as "states" 
     var states = collection.mutable.Map[String, String]() 

     //Searching the tree list for a given state and adding the map and //tree list to the states map collection 

    trees.map(x => (x.split("\t", -1))).filter((_.length > 2)).map(x => 

     //using try catch block for handling match not found exception 
     try { 
     if (x(2).contains(state)) states += (state -> x(0)) 
     } 
     catch { 
     //exception if caught to None 
     case e: Exception => println(s"None") 
     }) 
     //printing map "states" values 
     states.foreach(println) 
    } 
    } 
} 

输出我得到如下: - (MN,Quercus acerifolia)

预期输出: - (州名,树名单)

(MN,Quercus acerifolia) 
(MN,Quercus ajdfensis) 

我只能打印一个不能打印所有比赛的比赛。不知道代码中出了什么问题?看起来地图只迭代一次而不是所有的匹配。请让我知道如何打印所有比赛?

回答

0

states是一张地图,一个数据结构,它将每个键映射到一个单个值。因此,如果要为同一个键累积多个结果,则映射是错误的数据结构。

+0

非常感谢。我认为你是对的,我认为地图将允许scala中的单个键的多个值,而不是这种情况。我们需要多个地图。我使用列表处理。 – Issaq

1
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 

您是否试过寻找MN以外的东西? 您的最后一行是,MN,这可能与您的字符串比较有关。

+0

是的,我尝试使用“searchTrees(”AL“,treeList)”只有一个匹配。预计两场比赛。我不认为最后的记录是我尝试删除相同问题的一个问题。 – Issaq

+1

如果您搜索“,MN”,您会发现其他情况。问题是List#只包含一个完全匹配的字符串,而你想匹配一个包含字符串的字符串。这意味着你想要做的是在每个字符串内搜索。 – pedrofurla

+0

是的,我只想搜索包含“国家名称”提供的行,并将树列表添加到地图。问题只是给我第一场比赛。如果我删除了从输入文件中获得的匹配项,并运行了其他匹配项。我认为这只是第一场比赛而不是所有的比赛。 – Issaq