2015-07-21 99 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)