Erlang сортировка по верхнему и нижнему регистру

вопрос о сравнении верхнего и нижнего регистра ... как я могу сделать это в моей функции сортировки. есть идеи?

Пример: Входной файл: «Я счастлив!»

Выходной файл:

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

person Marley    schedule 17.12.2012    source источник


Ответы (3)


как насчет такого:

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

вот почему мой отсортированный порядок немного отличается от вашего исходного сообщения.

person Jr0    schedule 17.12.2012

Когда в сортировке есть хотя бы N*log2(N) сравнений, нет необходимости делать N*log2(N), а только N преобразований case. (Почти все 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 наихудший случай.

person Hynek -Pichi- Vychodil    schedule 19.12.2012

вам нужно сравнить низкую кепку в вашей функции сортировки:

([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]).
person Pascal    schedule 17.12.2012
comment
Здравствуйте, Паскаль, большое спасибо за ответ, но не могли бы показать мне, как можно реализовать, например, быструю сортировку. быстрая сортировка([])-›[]; ([X|XS])-> быстрая сортировка([Y||Y‹-XS,Y‹X])++[X]++быстрая сортировка([Y||Y‹-XS,Y›X]). - person Marley; 17.12.2012
comment
Привет, Марли, я завершил ответ выше. - person Pascal; 19.12.2012