我想知道是否有一种有效/简单的方法来通过匹配设置顺序的另一个列表的值来重新排序列表列表.更具体地说,如果我有以下列表:
[["a", "1", "2"], ["b", "2", "3"]]
Run Code Online (Sandbox Code Playgroud)
我想订购以下列表:
["b", "a"]
Run Code Online (Sandbox Code Playgroud)
产生新订单:
[["b", "2", "3"], ["a", "1", "2"]]
Run Code Online (Sandbox Code Playgroud)
有谁知道如何做到这一点?
提前致谢!
最诚挚的问候,Skyfe.
基本上这是通过提供特殊的订购功能,
import Data.List
import Data.Ord
byLoc :: Eq a => [a] -> -- The list that we're sorting by
[a] -> -- First list
[a] -> -- Second list
Ordering
byLoc ords = comparing (elemIndex . head)
Run Code Online (Sandbox Code Playgroud)
comparing 采用一个接收两个列表的函数,并在我们的排序列表中查找每个列表的第一个元素,比较位置.
那我们就是
sortLoc ords = sortBy (byLoc ords)
Run Code Online (Sandbox Code Playgroud)
我们完成了.不幸的是,这真的很慢.
更快的解决方案是
import Data.Maybe
import Data.List
sortLoc ords xs = mapMaybe lookup ords
where lookup e = find ((==e) . head) xs
Run Code Online (Sandbox Code Playgroud)
在这里,我们只是查找列表中的相应元素mapMaybe.如果没有找到任何元素,那么我们就跳过它.
或者,如果您想支持具有相同键的多个元素
sortLoc ords xs = mapConcat lookup ords
where lookup e = filter ((==e) . head) xs
Run Code Online (Sandbox Code Playgroud)