在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问题。无需谢谢,我会看的。谢谢,我会在早上发布新问题。嗨,我已经发布了新问题,其中包含了我想要实现的目标的更多细节