【发布时间】:2020-03-18 12:09:44
【问题描述】:
让我们有一个集合如下:
type Row = IndexedSeq[Any]
type RowTable = IndexedSeq[Row]
val table: RowTable = IndexedSeq(
IndexedSeq(2, "b", ... /* some elements of type Any*/),
IndexedSeq(1, "a", ...),
IndexedSeq(2, "c", ...))
RowTable 中的每个Row“具有相同的架构”,这意味着例如如果表中的第一行包含Int, String, ...,那么表中的第二行包含相同类型的元素相同的顺序,即Int, String, ...。
我想根据Row 元素的给定索引和该元素的排序方向(升序或降序)对RowTable 中的Rows 进行排序。
例如,上面的集合将按这种方式排序,索引 0 升序和索引 1 降序,其余元素在排序中并不重要:
1, "a", ...
2, "c", ...
2, "b", ...
由于Row是IndexedSeq[Any],我们不知道每个元素的类型来比较它;但是,我们知道它可能会被转换为 Comparable[Any],因此有 compareTo() 方法将其与另一行中相同索引下的元素进行比较。
如上所述,确定排序顺序的索引在我们开始排序之前是未知的。如何在 Scala 中编写代码?
【问题讨论】:
-
拥有
Any几乎总是一种代码味道。这通常意味着设计错误。 -
这是与 Java 和遗留代码的互操作;我也讨厌
Any:\ -
关于哪些字段排序以及如何排序的信息是静态的还是动态的?关于列数及其类型的信息是静态的还是动态的?
-
两者都是动态的