2番目の要素でタプルのリストを並べ替える必要があります。タプルのリストを2番目の要素でソート
例入力:
[("Bob",3),("Terry",1)]
出力例:
[("Terry",1)("Bob",3)]
2番目の要素でタプルのリストを並べ替える必要があります。タプルのリストを2番目の要素でソート
例入力:
[("Bob",3),("Terry",1)]
出力例:
[("Terry",1)("Bob",3)]
あなたがsortBy
とcomparing
を使用することができます。
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
とは異なるが、時間から時間に素敵なトリックはない:
どこからでも呼び出す独自の並べ替え関数を定義したい場合、これをどのように正確に行うことができますか?これを複数回使用する必要があるかもしれません – user1214840
言い換えれば、タプルを並べ替える独自の並べ替え関数を定義して、その2番目の要素に基づいて並べ替え、同じ並べ替えられたタプルの一覧を返します。 – user1214840
@ user1214840他の定義と同じです: 'myFancySort = { - 実装はここでのヒントを使用しています - }' –
別のクールなトリックがData.Functionからon
を使用することです。
'on'は素晴らしいトリックを持っています。時には 'equating = on(==)'が有用であることがあります。 ( '比較=比較 ') –
は、「通常の」ソート
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に設けられています。
これは宿題に関する質問ですか?もしそうなら、あなたは '宿題'タグを加えるべきです。 –