2010-12-17 11 views
2

Ich bin nur ein absoluter Anfänger in Quecksilber und finde es schwierig, dieses Problem zu lösen. Ich möchte eine Liste in eine Liste von Tupeln konvertieren, die von kleineren zu höheren Frequenties sortiert sind. ZB:Liste in Tupel in Merkur umwandeln

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}] 

Sie können sehen, dass die ganze Liste von Tupeln von kleineren zu höheren frequenties sortiert werden.

Ich frage, ob jemand mir helfen kann, es zu tun oder ein Zeiger auf ein Tutorial, wo ich weitere Tipps finden kann, um es zu tun.

Vielen Dank für Ihre Antwort.

+0

Was haben Sie bisher versucht, dieses Problem zu lösen? Und ist das ein Hausaufgabenproblem? (Wenn ja, die Antwort könnte ein bisschen spät sein ....;) –

Antwort

4

Die Standard-Bibliothek hat zum Beispiel den Bag-Datentyp, der alle Werkzeuge bereithält. Sie konvertieren Ihre Liste im Grunde nur in eine Tasche und wandeln sie dann in eine Liste mit den Frequenzen um. Verwenden Sie dann die Sortierung für Listen, um sie nach Ihren Wünschen sortieren zu lassen. Oder Sie können das selbe von Hand tun und die Liste mit einer Karte als Akkumulator umblättern, in dem Sie die gefundenen Elemente mit ihrer Häufigkeit speichern.

Ein Beispiel mit der Tasche:

:- 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).