首页 > 解决方案 > 有没有办法在 Scala 中对 CSV 文件中的值进行排序?

问题描述

我有一个输出如下行的 csv 文件:

Distributed Systems|SOFE 4790U|M|14|10|17|0|University Building A1 UA2240
Research Methods|SSCI 2900U|F|14|10|17|0|61 Charles DTA219
Social Control|SSCI 2030U|R|14|10|17|0|61 Charles DTA219

是否有根据一列对 csv 文件中的值进行排序?就像说代表星期几的第三列。我将如何按 MTWRF 的顺序对其进行排序?我一直在尝试使用案例类并覆盖 equals/compare 方法,但不确定从我所拥有的去哪里?

case class Foo(i: String)
{
    override def equals()
}
val a = Foo("F")
val b = Foo("M")
println(a<b)

任何帮助都会很棒。

标签: stringscalacsvsorting

解决方案


您可以将其实现为字符串比较,但构建单独的 ASTDayOfWeek类型会更简洁。

sealed trait DayOfWeek extends Comparable[DayOfWeek] {
  val value: Int
  override def compareTo(o: DayOfWeek): Int = value compareTo o.value
}

object DayOfWeek {
  case object M extends DayOfWeek { val value = 0 }
  case object T extends DayOfWeek { val value = 1 }
  case object W extends DayOfWeek { val value = 2 }
  case object R extends DayOfWeek { val value = 3 }
  case object F extends DayOfWeek { val value = 4 }
}

现在,我们不会看到<运算符,但幸运的是,Scala 有扩展方法的概念。

object DayOfWeek {
  // ...

  implicit class syntax(dow: DayOfWeek) {
    def <(other: DayOfWeek): Boolean = (dow compareTo other) < 0
  }
}

现在你可以像这样使用它

import DayOfWeek._
println(M < T)
// true

如果你想用字符串构造这种类型,你可能会选择类似的东西

object DayOfWeek {
  // ...

  // this method is unsafe, you might consider returning option instead, this is just for demonstartion purposes
  def apply(s: String): DayOfWeek = s match {
    case "M" => M
    case "T" => T
    case "W" => W
    case "R" => R
    case "F" => F
  }
}

import DayOfWeek._
println(DayOfWeek("M") < DayOfWeek("T"))
// true

推荐阅读