Scala,在数组中查找最大值

时间:2014-05-30 10:22:19

标签: scala

我第一次在这里问一个问题,就像我这样的新手没有足够的Scala信息。

基本上我所拥有的是一个文件,其中包含数十万个这样格式化的列表:

(type, date, count, object)

行看起来像这样:

(food, 30052014, 400, banana)

(food, 30052014, 2, pizza)

我需要的只是找到计数最多的一行。

我知道我几个月前就这样做了,但现在似乎无法绕过它。我确信我也可以在没有功能的情况下做到这一点。我想要做的就是设置一个值并将该行放入其中但我无法理解它。

我认为基本上我想做的是列表中第3个元素的Math.max,但我无法得到它。

任何帮助将不胜感激。对不起,如果我的问题的措辞或格式不是最好的。

编辑:我遗漏了一些我应该补充的额外信息:

所有记录都存储在tsv文件中。我这样做是为了分裂它们:

val split_food = food.map(_.split("/t"))

基本上我认为我需要使用split_food ......某种程度上

4 个答案:

答案 0 :(得分:3)

@Szymon的修改版本回答了您的编辑地址:

val split_food = food.map(_.split("/t"))
val max_food = split_food.maxBy(tokens => tokens(2).toInt) 

或类似地:

val max_food = split_food.maxBy { case Array(_, _, count, _) => count.toInt }

如果你正在使用apache spark的RDD,它通常的scala集合方法数量有限,你必须使用reduce

val max_food = split_food.reduce { (max: Array[String], current: Array[String]) =>
   val curCount = current(2).toInt
   val maxCount = max(2).toInt // you probably would want to preprocess all items, 
                               // so .toInt will not be called again and again 
   if (curCount > maxCount) current else max 
}

答案 1 :(得分:2)

您应该使用maxBy功能:

case class Purchase(category: String, date: Long, count: Int, name: String)

object Purchase {
  def apply(s: String) = s.split("\t") match {
    case Seq(cat, date, count, name) => Purchase(cat, date.toLong, count.toInt, name)
  }
}

foodRows.map(row => Purchase(row)).maxBy(_.count)

答案 2 :(得分:0)

简单地:

case class Record(food:String, date:String, count:Int)
val l = List(Record("ciccio", "x", 1), Record("buffo", "y", 4), Record("banana", "z", 3))
l.maxBy(_.count)

>>> res8: Record = Record(buffo,y,4)

答案 3 :(得分:0)

不确定你是否得到了答案,但我遇到了与maxBy相同的问题。我发现一旦我运行了包... import scala.io.Source我能够使用maxBy并且它有效。