【问题标题】:Scala find min/max in a sequence of tuplesScala 在元组序列中查找最小值/最大值
【发布时间】:2017-12-05 12:39:41
【问题描述】:

我想要一个val the_min,它可以从定义为的序列中获取最小值:

def datesSequence(): Seq[(String, String, String)] = {
....
}

作为序列的格式化输出:

println(datesSequence().map { case (y: String, m: String, d: String) => s"$y-$m-$d" } mkString(", ") )

2017-05-13、2017-05-12、2017-05-11、2017-05-10、2017-05-09、 2017-05-08, 2017-05-07, 2017-05-06, 2017-05-05, 2017-05-04, 2017-05-03, ... 2017-06-02

我试图对这种结构进行简单减少以获得最小值或最大值的尝试没有奏效..

上述示例(日期在 2017/05/13 和 2017/06/02 之间)的期望输出为: 最小:20170513 最大:20170601

谢谢

【问题讨论】:

  • 为什么你的尝试没有成功?出了什么问题?

标签: scala max min reduce


【解决方案1】:

现在元组构成yyyyMMdd 形式,您可以通过以下方式获取最小值:

datesSequence().minBy(_.toString)

附带说明,虽然它是在给定条件下的快速而肮脏的解决方案,但请考虑将您的日期表示为 true Date

【讨论】:

    【解决方案2】:

    如果我正确理解您的问题,您可以简单地将minmax 应用于您提供的日期字符串列表(如果它们格式正确(例如,以填充的 yyyymmdd 格式):

    val dateSeq: Seq[(String, String, String)] = Seq(
      ("2017", "5", "16"),
      ("2017", "6", "1"),
      ("2017", "5", "13"),
      ("2017", "5", "28"),
      ("2017", "6", "2"),
      ("2017", "5", "20"),
      ("2017", "5", "25")
    )
    
    // Not needed if month and day in the source list were already properly padded
    def padded(s: String) = if (s.length < 2) "0" + s else s
    
    val formatedDateSeq = dateSeq.map{ case (y, m, d) => y + padded(m) + padded(d) }
    
    formatedDateSeq.max
    // res1: String = 20170602
    
    formatedDateSeq.min
    // res2: String = 20170513
    

    【讨论】:

      【解决方案3】:

      真的很简单。只需告诉minBy()maxBy() 方法如何测量元组即可。

      dateSeq.minBy(x => x._1+x._2+x._3) //res0: (String, String, String) = (2017,05,03)
      dateSeq.maxBy(x => x._1+x._2+x._3) //res1: (String, String, String) = (2017,06,02)
      

      【讨论】:

      • 为什么不只是dateSeq.mindateSeq.max?如果您如此渴望为他做作业,您至少可以一次向他展示如何做。
      猜你喜欢
      • 1970-01-01
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 2014-07-21
      • 1970-01-01
      • 2018-05-03
      • 1970-01-01
      相关资源
      最近更新 更多