1

大文字と小文字の比較についての質問..どうすればソート機能でそれを行うことができますか?

例: 入力ファイル : " I am Happy! "

出力ファイル:

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

このようなものはどうですか:

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 に答える
1

並べ替えで少なくとも比較がある場合は、大文字と小文字の変換のみN*log2(N)を行う必要はありません。(ほぼすべての perl 開発者がこのトリックを知っています。)N*log2(N)N

{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 に答える
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> 

編集:

あなたのコードでは、リストをソートできる関数は演算子 > と < です (複製された文字列を見たい場合は、そのうちの 1 つに = を含める必要があります。それ以外の場合は、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]).
于 2012-12-17T07:28:08.130 に答える
0

Windows現在、またはのどちらにいるかに応じてUnix/Linux、ファイル内の行は異なる文字で終了します。通常は\r\n. 入力ファイルが大きすぎないと仮定すると、一度にバイナリに読み込むことができます。取得したデータのストリームは行に分割し、次に各行を単語 (スペース) に分割する必要があります。入力ファイルが非常に大きく、メモリに収まらない場合は、行ごとに読み取る必要があります。この場合、ソートの準備ができているすべての単語を保持するためのメモリ内バッファが必要になる場合があります。これには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")。
開始()-> ケースファイル:read_file(?INPUT_FILE)の {わかりました、バイナリ} -> %% 入力ファイルの読み取り 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), file:write_file(EndFile,SortedText), わかった; エラー -> {エラー,エラー} 終わり。
それはうまくいくはずです。ソースファイルのマクロを設定に合わせて変更し、実行するだけですsick_sort:start().

于 2012-12-17T07:39:38.937 に答える