47 lines
1.4 KiB
Plaintext
47 lines
1.4 KiB
Plaintext
module OptionalParameters {
|
|
typedef Type<String >.Orderer as ColumnOrderer;
|
|
typedef Type<String[]>.Orderer as RowOrderer;
|
|
|
|
static String[][] sort(String[][] table,
|
|
ColumnOrderer? orderer = Null,
|
|
Int column = 0,
|
|
Boolean reverse = False,
|
|
) {
|
|
// provide a default orderer
|
|
orderer ?:= (s1, s2) -> s1 <=> s2;
|
|
|
|
// optionally reverse the order
|
|
ColumnOrderer byString = reverse
|
|
? ((s1, s2) -> orderer(s1, s2).reversed)
|
|
: orderer;
|
|
|
|
// sort the indicated column
|
|
RowOrderer byColumn = (row1, row2) -> byString(row1[column], row2[column]);
|
|
|
|
return table.sorted(byColumn);
|
|
}
|
|
|
|
void run() {
|
|
String[][] table =
|
|
[
|
|
["c", "x", "i"],
|
|
["a", "y", "p"],
|
|
["b", "z", "a"],
|
|
];
|
|
|
|
show("original input", table);
|
|
show("by default sort on column 0", sort(table));
|
|
show("by column 2", sort(table, column=2));
|
|
show("by column 2 reversed", sort(table, column=2, reverse=True));
|
|
}
|
|
|
|
void show(String title, String[][] table) {
|
|
@Inject Console console;
|
|
console.print($"{title}:");
|
|
for (val row : table) {
|
|
console.print($" {row}");
|
|
}
|
|
console.print();
|
|
}
|
|
}
|