2012-02-16 23 views
11

2番目の要素でタプルのリストを並べ替える必要があります。タプルのリストを2番目の要素でソート

例入力:

[("Bob",3),("Terry",1)] 

出力例:

[("Terry",1)("Bob",3)] 
+2

これは宿題に関する質問ですか?もしそうなら、あなたは '宿題'タグを加えるべきです。 –

答えて

13

あなたがsortBycomparingを使用することができます。

sortBy :: (a -> a -> Ordering) -> [a] -> [a] 
comparing :: (Ord b) => (a -> b) -> a -> a -> Ordering 

この場合、我々は第二の要素で比較したいです。 comparing sndを使用すると、2つのタプルを2番目の要素で比較できる関数を得ることができます。

import Data.Function (on) 
import Data.List (sortBy) 

sortBy (compare `on` snd) [...] 

ずっとcomparingとは異なるが、時間から時間に素敵なトリックはない:

+0

どこからでも呼び出す独自の並べ替え関数を定義したい場合、これをどのように正確に行うことができますか?これを複数回使用する必要があるかもしれません – user1214840

+0

言い換えれば、タプルを並べ替える独自の並べ替え関数を定義して、その2番目の要素に基づいて並べ替え、同じ並べ替えられたタプルの一覧を返します。 – user1214840

+2

@ user1214840他の定義と同じです: 'myFancySort = { - 実装はここでのヒントを使用しています - }' –

15

別のクールなトリックがData.Functionからonを使用することです。

+4

'on'は素晴らしいトリックを持っています。時には 'equating = on(==)'が有用であることがあります。 ( '比較=比較 ') –

2

は、「通常の」ソート

sort xs = ... a < b ... 

このような種類がcompareの使用を作る、またはそのような<などその友人必要があります考えてみましょう。だから既にそのようなことを実装しているのであれば、ただcompare a bまたはa < bの代わりに、compare (snd a) (snd b)またはsnd a < snd bを実行することができます。もちろん

sort xs = ... snd a < snd b ... 

スマート取得する場合、あなたは「アクセサ」アウト抽象よ、とソート機能に追加入力します:

sortComparingOn f xs = ... f a < f b ... 

あなたが完全にコンパレータ出ても、抽象的かもしれません:ehirdに述べたように

sortBy cmp xs = ... a `cmp` b ... 

sortByは、Data.Listに設けられています。

関連する問題