scala - 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" )
任何帮助,将不胜感激。
解决方案
非常感谢有关如何改进此块的任何反馈。
我的建议:重新开始。
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)}
)
}
在将所有数据收集到一个实例List
中State
之后,您只需要一些工具来操作和格式化列表和字符串。
例如,假设您想以一致且组织良好的方式打印出所有数据。
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
你明白了。
推荐阅读
- ubuntu - How to install specified version of Composer
- ubuntu - 我遇到数据库恐慌:数据库遇到严重错误,需要重新启动
- java - 根据存储在 Firebase-Android 中的值计算总计
- javascript - Javascript: filter an array of objects using an array
- apache - 尽管未指定重定向且 .htaccess 中不满足条件,但仍发生 301 重定向
- php - 具有相同数组名称的 Foreach 循环数组
- java - 如何等到没有具有属性 ready_to_send 的跨度标签或换句话说具有已发送属性的跨度标签
- java - 在 Java 中转换日期
- batch-file - 批处理文件从配置文件加载变量,跳过注释
- python - 在画布中移动鼠标并显示以相同方式移动但在另一个画布中移动的点