2015-07-21 91 views
1

我是新来的Scala,我写了一段代码,它将员工文件(empId,姓名,年龄,薪水,部门)作为输入并打印出部门和总部的工资。如何编写单行scala代码?

这是一个新手代码。如何缩短代码?请帮助

代码:

object UsingCollectionMaps { 
    def main(a: Array[String]) { 
    val filename = "Employee.txt" 
    var map = collection.mutable.Map[String,Long]() 
    var sal: Long = 0 
    for (line <- Source.fromFile(filename).getLines()) { 
     val fields = line.split(",") 
     if (map.contains(fields(4))) { 
     map.put(fields(4), (map(fields(4)) + fields(3).toLong)) 
     } else { 
     map.put(fields(4), fields(3).toLong) 
     } 
    } 
    println(map) 
    } 
} 
+0

上述代码有效。我只想看看它如何缩短。 – Coolsam

+6

这是http://codereview.stackexchange.com/的情况吗? – Madoc

+1

您可以用分号替换所有换行符,并且您有单行代码。你确定*你想问什么? –

回答

3

这不是大大缩短,但需要一个功能更强大的方法:

import collection.immutable.Map 
import io.Source 

object UsingCollectionMaps { 
    def main(args: Array[String]) { 
    println(
     Source.fromFile("Employee.txt").getLines() 
     .foldLeft(Map.empty[String, Long])({ 
      case (totals, line) => 
      val fields = line.split(",") 
      val department = fields(4) 
      val salary = fields(3).toLong 
      totals.updated(department, 
       totals.getOrElse(department, 0L) + salary) 
     }) 
    ) 
    } 
} 
+0

我更喜欢Noam的回答。 –

4

你可以使用.groupBy方法来创建DEPARTEMENT的”一个Map ' - >'员工'然后总计他们的工资:

object UsingCollectionMaps { 
    def main(a:Array[String]){ 
    val filename = "Employee.txt" 
    val lines = io.Source.fromFile(filename).getLines().toList 
    val map = employees.map(_.split(",")) 
         .groupBy(_(4)) // Group by the fourth element of the arrays 
         .mapValues(_.map(_(3).toLong).sum) // Map an employeeList to their salaries and sum them 
    println(map) 
    } 
} 
8

我会尽量避免使用这些可变结构,也可以理解这个文件,并将它正确地分配给一个case类。 之后,使用groupBy和sum。

import scala.io.Source 

case class Employee(empId: String, name: String, age: Int, 
        salary: Long, department: Int) 

Source.fromFile("someFile.txt") 
     .getLines() 
     .map(_.split(",")) 
     .map(l => Employee(l(0), l(1), l(2).toInt, 
          l(3).toLong, l(4).toInt)) 
     .toSeq 
     .groupBy(_.department) 
     .mapValues(_.map(_.salary).sum)