【发布时间】:2018-12-19 15:25:46
【问题描述】:
考虑以下嵌套列表:
[["AXY"],["ABC","XYZ"],["EFG","ACF"]]
我想按每个内部列表的第一个元素按字典顺序对列表进行排序。输出应该是:
[["ABC","XYZ"],["AXY"],["EFG","ACF"]]
如果任务只是对一个列表进行排序,我将使用以下线程中的一种方法 (link)。但是如何对嵌套列表进行排序呢?
【问题讨论】:
标签: sml
考虑以下嵌套列表:
[["AXY"],["ABC","XYZ"],["EFG","ACF"]]
我想按每个内部列表的第一个元素按字典顺序对列表进行排序。输出应该是:
[["ABC","XYZ"],["AXY"],["EFG","ACF"]]
如果任务只是对一个列表进行排序,我将使用以下线程中的一种方法 (link)。但是如何对嵌套列表进行排序呢?
【问题讨论】:
标签: sml
假设您有一个带有 cmp 函数的通用排序函数(如 at the bottom of this answer 所示的那个),您只需要编写一个带有两个字符串列表的函数:
fun cmpnest ((x::xs):string list, (y::ys):string list) = if x > y then GREATER else LESS
| cmpnest ((x::xs):string list, nil) = GREATER
| cmpnest (nil, _) = LESS
之后,您可以在通用排序函数中使用它:
- sort cmpnest [["AXY"], ["ABC", "XYZ"], ["EFG", "ACF"]];
> val it = [["ABC", "XYZ"], ["AXY"], ["EFG", "ACF"]] : string list list
【讨论】:
作为对 L3viathan 回答的补充,您还可以使用String.compare:
fun cmpnest (x::_, y::_) = String.compare (x, y)
| cmpnest (_::_, []) = GREATER
| cmpnest ([], _) = LESS
【讨论】: