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

你可以看到所有的元组列表都是按照频率从小到大排序的。

我在问是否有人可以帮助我解决它或指向教程的指针,我可以在其中找到更多提示。

感谢您的回复。

4

1 回答 1

4

例如,标准库具有很好地准备好所有工具的 bag 数据类型。您基本上只需将列表转换为包,然后将包转换回具有频率的列表。然后使用 sort for 列表将其排序为您想要的。或者您可以手动执行相同操作,并使用地图折叠列表作为累加器,您可以在其中存储遇到的元素及其出现次数。

以包为例:

:- 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).
于 2011-02-06T16:58:26.540 回答