2012-12-17 52 views
1

關於大小寫比較的問題..我可以在我的排序函數中做到這一點。任何想法?Erlang大寫和小寫排序

例如:Inputfile中: 「我很高興!」

OUTPUTFILE:

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

回答

0

你h AVE低蓋在你的排序功能比較:

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

編輯:

在你的代碼,允許對列表進行排序是運營商的功能>和<(如果你想看到複製串一個他們應該包括=,否則你會做一個usort)。如果您想使用不同的比較,你可以在一個正常的或匿名函數定義它,然後在快速排序使用它:

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]). 
+0

你好,帕斯卡爾,非常感謝你的回答,但是可以告訴我,卡尼如何實施例如快速排序。快速排序([]) - > []; ([X | XS]) - > quicksort([Y || Y <-XS,Y X])。 – Marley

+0

嗨馬利,我完成了上面的答案。 – Pascal

0

現在,取決於你是否在WindowsUnix/Linux,在文件中的行將以不同的字符結尾。讓我們去一般的\r\n。現在假設輸入文件不是太大,我們可以一次讀入二進制文件。我們得到的數據流必須分成幾行,然後將每行分割成單詞(空格)。如果輸入文件非常大並且無法放入內存,則需要一行一行地讀取它,在這種情況下,您可能需要一個IN-Memory緩衝區來保存所有單詞,以便進行排序,這需要ETS Table,或Memcached(我不會在這裏說明一個選項)。

讓我們編寫代碼

 
-module(sick_sort). 
-compile(export_all). 
-define(INPUT_FILE,"C:/SICK_SORT/input.txt"). 
-define(OUTPUT_FILE_PATH,"C:/SICK_SORT/"). 
-define(OUTPUT_FILENAME,"output.txt").
start()-> case file:read_file(?INPUT_FILE) of {ok,Binary} -> %% input file read AllLines = string:tokens(binary_to_list(Binary),"\r\n"), SortedText = lists:flatten([XX ++ "\r\n" || XX <- lists:sort(string:tokens(AllLines," "))]), EndFile = filename:join(?OUTPUT_FILE_PATH,?OUTPUT_FILENAME), file:write_file(EndFile,SortedText), ok; Error -> {error,Error} end.
這應該工作。更改宏在源文件中,以滿足您的設置,然後,只需運行 sick_sort:start().

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 

這就是爲什麼我的排序順序與原來的文章有點不同。

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

BTW lists:sort/1歸併排序已授予N*log2(N),是違背簡潔但效率較低快速排序實現相當有效。更糟糕的是,快速排序有最壞的情況。