2012-12-17 6 views
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)]. 

답변

0

당신의 정렬 기능 낮은 캡을 비교하기 위해 집결지 :

([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를 할 것입니다). 다른 비교를 사용하려면 당신은 정상 또는 익명 함수를 정의하고 다음 퀵에서 사용할 수 있습니다 : 당신이 Windows 또는 Unix/Linux, 파일의 라인인지에 따라, 이제

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

안녕하세요, 파스칼 님, 답변 해 주셔서 감사합니다.하지만 cani가 예를 들어 quicksort에 구현하는 방법을 보여줄 수 있습니다.quicksort ([]) -> [];([X | XS]) -> quicksort ([Y || Y <-XS, Y X]). – Marley

+0

안녕하세요, Marley, 위의 답변을 완료했습니다. – Pascal

0

다른 문자로 끝납니다. 보통은 \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"] 

난 그렇게 믿어 "I"

8> "happy" < "i". 
true 
보다는 "행복"종류 이하

내 정렬 된 순서가 원래 게시물보다 조금 다른 이유입니다.

1

정렬에서 적어도 N*log2(N) 비교가있는 경우 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). 

BTW lists:sort/1 병합 정렬은 N*log2(N)을 부여하고 간결하지만, 덜 효율적 빠른 정렬 구현에 반하는 꽤 효율적입니다했다. 더 나쁜 것은 빠른 정렬이 N^2 최악의 경우입니다.