string - 有没有办法在 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)
任何帮助都会很棒。
解决方案
您可以将其实现为字符串比较,但构建单独的 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
推荐阅读
- jsonpath - 如何使用 jsonpath 获取具有特定名称的地址值
- python-3.x - 使用 openstacksdk 启动实例时执行自定义脚本
- sql-server - 查询“必须声明标量变量”
- c# - 如何删除列表视图中的内容,维护框架(Windows Forms C#)
- mosaic - Yolov4 马赛克数据增强
- docker - 在 docker-compose 中设置相对路径
- r - 使用条件语句(case_when)跨多个列更改 kableExtra 中的单元格颜色
- c++ - 无限while循环C++ char
- unity3d - 如何将 Unity 3d 与 BLED112 蓝牙 USB 加密狗连接?
- python - 是否有可以预测大多数纯数学函数的激活函数?