在Scala应用程序中未识别/使用Val
提供了以下文本文件:在Scala应用程序中未识别/使用Val,scala,mapping,Scala,Mapping,提供了以下文本文件: 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,Othe
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 readFile(文件名:String):Map[(String,Int),Map[String,Int]={
val mapBuffer:Map[(字符串,Int),Map[String,Int]]=Map()
试一试{
为了(线路)
val entries=x.split(“,”).toList
val stateAndCode=entries.head
val state=stateAndCode.takeWhile(!=')(').trim
val code=stateAndCode.dropWhile(!=')(').takeWhile(!=')).toInt
val vots=entries.tail.map{x=>
val数组(参与方,编号)=x.split(“:”)
(party.trim,number.toInt)
}
((state,code),vots.toMap)}.groupBy(u._1).view.mapValues(u.head).toMap
}
}
抓住{
案例ex:Exception=>println(“对不起,发生了异常”)
}
映射缓冲区
}
如果您有任何关于如何改进此块的反馈,我们将不胜感激。地图的第一个用途基本上是从地图返回所有信息-这是给出的说明:
获取所有州/地区值并以适当的格式显示。
尝试的实现如下所示:
def statedoves=parties.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)}
)
}
将所有数据收集到实例的列表
中后,您只需要一些工具来操作和格式化列表和字符串
例如,您希望以一致且组织良好的方式打印所有数据
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
Arizona : 3387326
Alabama : 2323282
Alaska : 359530
或者你想看看每个州的选票总数
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)
结果:
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
Arizona : 3387326
Alabama : 2323282
Alaska : 359530
你明白了。有没有办法让状态实例列表成为映射?比如map[String,Int,list[(String,Int)]但是数据的行为是否与此相同?我正试图通过actionMap/处理程序触发此操作,但无法完全破解它。我能否通过截图等向您发送电子邮件,对我的问题进行更深入的解释?还是您希望我写一个新的stackoverflow Q并为您添加标签?@jwvh您当然可以使用映射,但映射
需要两种类型:键类型和值类型。您如何管理这三种类型:String
、Int
和List
?您可能有两个映射,一个String
->Int
映射以及一个String
->List
映射。听起来很麻烦,但可行。发布一个新的SO问题。无需谢谢,我会看的。谢谢,我会在早上发布新问题。嗨,我已经发布了新问题,其中包含了我想要实现的目标的更多细节