2010-12-17 7 views
2

私は水銀中の初心者です。この問題を解決するのは難しいです。私は、リストを小規模から高頻度にソートされたタプルのリストに変換したい。例:水銀中のタプルのリストに変換する

string.to_char_list("this is a test") becomes 

[{'a', 1}, {'e', 1}, {'h', 1}, {'i', 2}, {' ', 3}, {'s', 3}, {'t', 3}] 

OR 

[3,2,1,2,1,1,2] becomes 

[{3, 1}, {1, 3}, {2, 3}] 

タプルのすべてのリストが小さい順にソートされていることがわかります。

私は誰かがそれをスローするのを助けることができるか、私はそれを行うためのヒントを見つけることができるチュートリアルへのポインタを要求しています。

ご返信ありがとうございます。

+0

あなたがこの問題を解決するために、これまで試してみましたか?そして、これは宿題の問題ですか? (もしそうなら、答えは少し遅れるかもしれません....;) –

答えて

4

標準ライブラリには、例えば、すべてのツールがうまく準備されたバッグデータ型があります。あなたは基本的にあなたのリストをバッグに変換してから、バッグを周波数のリストに戻します。次に、ソートを使用してリストをソートします。または、同じことを手作業で行い、遭遇した要素を発生回数とともに格納するアキュムレータとしてのマップを使用してリストを折り畳むことができます。バッグと

例:

:- module freq. 
:- interface. 
:- import_module io. 
:- pred main(io::di, io::uo) is det. 

:- implementation. 
:- import_module string. 
:- import_module list. 
:- import_module assoc_list. 
:- import_module bag. 

main(!IO) :- 
    List = string.to_char_list("this is a test"), 
    bag.from_list(List, Bag), 
    bag.to_assoc_list(Bag, ElemSortedAssocList), 
    list.sort(assoc_list.reverse_members(ElemSortedAssocList), CountSortedAssocList), 
    assoc_list.reverse_members(CountSortedAssocList, Result), 
    io.write(Result, !IO), 
    io.nl(!IO). 
関連する問題