我的输入文件如下。它包含每个客户的一些购买详细信息。
输入:
100,Surender,2015-01-23,PHONE,20000
100,Surender,2015-01-24,LAPTOP,25000
101,Ajay,2015-02-21,LAPTOP,40000
101,Ajay,2015-03-10,MUSIC_SYSTEM,50000
102,Vikram,2015-07-20,WATCH,60000
我的要求是我想了解每个客户的最新购买详细信息。
所以预期的输出是
预期输出:
List(101,Ajay,2015-03-10,MUSIC_SYSTEM,50000)
List(100,Surender,2015-01-24,LAPTOP,25000)
List(102,Vikram,2015-07-20,WATCH,60000)
我尝试了下面的代码,它给了我预期的输出..
但是下面的逻辑有点类似于 java 。
我的 Scala 代码:
package pack1
import scala.io.Source
import scala.collection.mutable.ListBuffer
object LatestObj {
def main(args:Array[String])=
{
var maxDate ="0001-01-01"
var actualData:List[String] =List()
var resultData:ListBuffer[String] = ListBuffer()
val myList=Source.fromFile("D:\\Scala_inputfiles\\records.txt").getLines().toList;
val myGrped = myList.groupBy { x => x.substring(0,3) }
//println(myGrped)
for(mappedIterator <- myGrped)
{
// println(mappedIterator._2)
actualData =mappedIterator._2
maxDate=findMaxDate(actualData)
println( actualData.filter { x => x.contains(maxDate) })
}
}
def findMaxDate( mytempList:List[String]):String =
{
var maxDate ="0001-01-01"
for(m <- mytempList)
{
var transDate= m.split(",")(2)
if(transDate > maxDate)
{
maxDate =transDate
}
}
return maxDate
}
}
有人可以帮助我使用 scala 以更简单的方式尝试相同的方法吗?
或者上面的代码是实现该逻辑的唯一方法?
最佳答案
甚至更简单的版本,也使用了巧合相同名称的案例类。不过,不会删除像 Tzach 那样的不良记录,并且我将所有内容保留为字符串。
case class Record(id: String, name: String, dateString: String, item: String, count: String)
myList.map { line =>
val Array(id, name, dateString, item, count) = line.split(",")
Record(id, name, dateString, item, count)
}
.groupBy(_.id)
.map(_._2.maxBy(_.dateString))
.toList
关于scala - 在scala中我们如何找到每个客户的最新记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38895984/