首页 > 解决方案 > Val 在 Scala 应用程序中未被识别/使用

问题描述

提供以下文本文件:

Alabama (9),Democratic:849624,Republican:1441170,Libertarian:25176,Others:7312
Alaska (3),Democratic:153778,Republican:189951,Libertarian:8897,Others:6904
Arizona (11),Democratic:1672143,Republican:1661686,Libertarian:51465,Green:1557,Others:475

希望创建一个 scala 应用程序 - 将文本文件中的数据映射到然后通过应用程序过滤。不确定为什么以下代码块中没有使用派对:

  def readFile(filename: String): Map[(String, Int), Map[String, Int]] = {
val mapBuffer: Map[(String, Int), Map[String, Int]] = Map()
try {
  for (line <- Source.fromFile(filename).getLines()) {
    val strings = line.split("\n").toList
    val  parties = strings.map { x =>
      val entries = x.split(",").toList
      val stateAndCode = entries.head
      val state = stateAndCode.takeWhile(_ != '(').trim
      val code = stateAndCode.dropWhile(_ != '(').takeWhile(_ != ')').toInt
      val votes = entries.tail.map { x =>
        val Array(party, number) = x.split(":")
        (party.trim, number.toInt)
      }
      ((state, code), votes.toMap)}.groupBy(_._1).view.mapValues(_.head).toMap
  }
}
catch {
  case ex: Exception => println("Sorry, an exception happened.")
}
mapBuffer
}

非常感谢有关如何改进此块的任何反馈。地图的第一个用途基本上是从地图中返回所有信息 - 这是给出的指令:

获取所有州/地区值并以适当的格式显示。

尝试的实现如下:

def stateVotes =party.keySet.map{case (party, code) => s"Party(district):", "\n", "\n" )

任何帮助,将不胜感激。

标签: scalamapping

解决方案


非常感谢有关如何改进此块的任何反馈。

我的建议:重新开始。

val dataRE = "([^(]+) \\((\\d+)\\),(.+)".r
val pVotes = "([^:]+):(\\d+)".r

case class State(name    : String
                ,code    : Int
                ,parties : Array[(String,Int)])

val states: List[State] =
  util.Using(io.Source.fromFile("data.txt"))(_.getLines().toList)
      .get  //will throw if read file fails
      .collect{case dataRE(name,code,votes) =>
        State(name.trim
             ,code.toInt
             ,votes.split(",")
                   .collect{case pVotes(p,v) => (p,v.toInt)}
             )
      }

在将所有数据收集到一个实例ListState之后,您只需要一些工具来操作和格式化列表和字符串。

例如,假设您想以一致且组织良好的方式打印出所有数据。

states.sortBy(_.name)     //alphabetical
      .foreach{ st =>
        println(st.name)  //state name
        st.parties
          .sortBy(-_._2)  //votes in decreasing order
          .map{case (p,v) => f"\t$p%-12s:$v%9d"}
          .foreach(println)
      }

结果:

Alabama
    Republican  :  1441170
    Democratic  :   849624
    Libertarian :    25176
    Others      :     7312
Alaska
    Republican  :   189951
    Democratic  :   153778
    Libertarian :     8897
    Others      :     6904
Arizona
    Democratic  :  1672143
    Republican  :  1661686
    Libertarian :    51465
    Green       :     1557
    Others      :      475

或者,也许您想查看每个州的投票总数。

states.map(st => (st.name, st.parties.map(_._2).sum))
      .sortBy(-_._2)  //votes in decreasing order
      .map{case (state,total) => f"$state%-9s:$total%8d"}
      .foreach(println)

结果:

Arizona  : 3387326
Alabama  : 2323282
Alaska   :  359530

你明白了。


推荐阅读