haskell排序[(String,String)]关于元组的第一个元素的子串

时间:2016-12-03 17:25:39

标签: string sorting haskell

我正在寻找关于元组第一元素的一小部分对[(String,String)]进行排序的方法

此问题类似于 Sort list of strings by a part of the string ,但在Haskell中。

sortBy (compare `on` fst) list

工作正常,但我需要优化搜索,以便格式化字符串" aa bb cc"将仅根据cc部分进行分类

我试着这样做:

sortBy (compare `on` ((!!2)(splitOn " " (fst)))

不幸的是它不起作用,可能是由于我对如何嵌套函数缺乏了解。

1 个答案:

答案 0 :(得分:1)

因为您必须查询每个组合中每个组合的最后一个值,所以此解决方案根本不是很有效。但至少有一种方法可以做到这一点(随意提出更好的选择,读者!)

import Data.List.Split
import Data.List

sortStrTuples :: [(String,String)] -> [(String,String)]
sortStrTuples = sortBy (compare `on` f)
                    where f (x,_) = last $ (splitOn " ") x

基本上,我们根据该列表的处理版本对提供的列表进行排序。对于每一对,我们将元组的第一个值中包含的字符串拆分为其空格,然后选择最后一个元素。因此,给定元组("blah1 blah2","blah blah"),我们的本地函数f返回“blah2”。然后我们依赖内置的字符串比较行为(符合我们想要的)。

测试这个,我们可以看到它的行为符合预期:

ghci>> sortStrTuples [("aa bb cc","blah"),("aa bbb","blah")]
[("aa bbb","blah"),("aa bb cc","blah")]