2016-12-03 36 views
0

我要尋找的路上的第一要素的子與關於元組的第一個元素的小部分哈斯克爾排序[(字符串,字符串)]相對於元組

這個問題是排序[(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))) 

不幸的是,它不起作用,可能是由於我不瞭解如何嵌套函數。

+2

'sortBy(。比較\'上\'((!! 2)splitOn 「」 FST))'將由第三比較元組的第一個元素的單詞。如果你想要最後一個單詞,使用'last'而不是'(!! 2)'。 – Gurkenglas

回答

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")] 
+1

我仍然用'on'來寫。 – 2016-12-03 18:17:49

+1

好點,改變了。 – mnoronha

相關問題