1

关于大小写比较的问题..我怎么能在我的排序函数中做到这一点。有什么想法吗?

例如:输入文件:“我很高兴!”

输出文件:

Happy!
I
am

这就是我的程序发生的事情,但我希望有:

am
I
Happy

我的代码:

-module(wp)
-compile([export_all]). % Open the File

sortFile(File1,File2) ->
    {ok, File_Read} = file:read_file(File1),
    % making a list
    Liste = string:tokens(binary_to_list(File_Read), "\n "),
    % isort List
    Sort_List = isort(Liste),
    ISort = string:join(Sort_List,"\n"),
    %Written in the File.
    {ok,Datei_Schreiben} = file:open(File2, write),
    file:write(File_Write, Isort),
    file:close(File_Write).

isort([]) -> [];
isort([X|XS])-> insert(X, isort(XS)).

insert(Elem, []) -> [Elem];
insert(Elem, [X|XS]) when Elem= [Elem,X|XS];
insert(Elem, [X|XS]) -> [X|insert(Elem,XS)].
4

4 回答 4

1

当排序中至少有N*log2(N)比较时,不需要进行N*log2(N)大小写N转换。(几乎所有 perl 开发人员都知道这个技巧。)

{ok, Bin} = file:read_file(?INPUT_FILE),
Toks = string:tokens(binary_to_list(Bin),"\n "),
Result = [[X,$\n] || {_,X} <- lists:sort([{string:to_lower(X), X} || X<-Toks])],
file:write_file(?OUTPUT_FILE, Result).

顺便说一句,与简洁但效率较低的快速排序实现相反,lists:sort/1合并排序已经授予并且非常有效。N*log2(N)更糟糕的是,快速排序有N^2最坏的情况。

于 2012-12-19T19:01:45.510 回答
1

像这样的东西怎么样:

qsort1([]) -> [];
qsort1([H|T]) -> 
     qsort1([X || X <- T, string:to_lower(X) < string:to_lower(H)]) 
     ++ [H] 
     ++ qsort1([X || X <- T, string:to_lower(X) >= string:to_lower(H)]).


7> qsort1(["I", "am","Happy"]).
   ["am","Happy","I"]

我相信“快乐”的排序小于“我”

8> "happy" < "i".
true

这就是为什么我的排序顺序与您的原始帖子有点不同的原因。

于 2012-12-17T15:32:19.017 回答
0

现在,根据您是 onWindows还是Unix/Linux,文件中的行将以不同的字符结尾。让我们使用通常的窗口\r\n。现在假设输入文件不是太大,我们可以一次将它们读入二进制文件。我们得到的数据流必须被分割成行,然后每一行被分割成单词(空格)。如果输入文件非常大并且无法放入内存,那么您将不得不逐行读取它,在这种情况下,您可能需要一个 IN-Memory 缓冲区来保存所有准备排序的单词,这将需要ETS Table, 或Memcached(我不会在这里说明的选项)。

让我们写代码

-模块(生病排序)。
-编译(export_all)。
-define(INPUT_FILE,"C:/SICK_SORT/input.txt")。
-定义(OUTPUT_FILE_PATH,“C:/SICK_SORT/”)。
-define(OUTPUT_FILENAME,"output.txt")。
开始()-> 案例文件:read_file(?INPUT_FILE) of {好的,二进制}-> %% 输入文件读取 AllLines = string:tokens(binary_to_list(Binary),"\r\n"), SortedText = lists:flatten([XX ++ "\r\n" || XX <- lists:sort(string:tokens(AllLines," "))]), EndFile = 文件名:join(?OUTPUT_FILE_PATH,?OUTPUT_FILENAME), 文件:write_file(EndFile,SortedText), 好的; 错误 -> {错误,错误} 结尾。
那应该行得通。更改源文件中的宏以适合您的设置,然后运行sick_sort:start().

于 2012-12-17T07:39:38.937 回答
0

您必须在排序功能中比较低上限:

(nitrogen@127.0.0.1)25> F= fun(X,Y) -> string:to_lower(X) < string:to_lower(Y) end.
#Fun<erl_eval.12.111823515>
(nitrogen@127.0.0.1)26> lists:sort(F,["I","am","Happy"]).                          
["am","Happy","I"]
(nitrogen@127.0.0.1)27> 

编辑:

在您的代码中,允许对列表进行排序的函数是运算符 > 和 <(如果您想查看复制的字符串,其中之一应该包括 =,否则您将进行排序)。如果您想使用不同的比较,您可以在普通或匿名函数中定义它,然后在快速排序中使用它:

mycompare(X,Y) ->
    string:to_lower(X) < string:to_lower(Y).

quicksort  ([])->[];
           ([X|XS])-> quicksort([Y||Y<-XS,mycompare(X,Y)])++[X]++quicksort([Y||Y<-XS,mycompare(X,Y) == false]).
于 2012-12-17T07:28:08.130 回答