Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.03.2012, 10:03
abc26 abc26 вне форума
Прохожий
 
Регистрация: 23.03.2012
Сообщения: 1
Репутация: 10
По умолчанию Сортировка...

Здравствуйте. Натолкните пожалуйста на мысль, как разобраться с такой проблемой:
Есть текстовый файл с построчно идущими номерами такого вида:

8/1/2б
3/1
3/3
4
6/1
7
8/2
6/1/2
6/1/4
8
4
8/1
2
8/1/1а
3/2
8/1/2а
3
1
6/1/3
8/1/1б
6/1/1
5
10
8/1/3б
6
8/3
9

Строки в этом файле нужно привести к такому состоянию:

* на "разветвлениях" буквы при наличии указывают какие номера должны стоять впереди

1
2
3
3/1
3/2
3/3
4
5
6
6/1
6/1/1
6/1/2
6/1/3
6/1/4
7
8
8/1
8/1/1а *
8/1/2а *
8/1/1б *
8/1/2б *
8/1/3б *
8/2
8/3
9
10


Т.е. отсортировать с учетом "вложенности".
для наглядности:


Заранее спасибо за любые подсказки.

Последний раз редактировалось abc26, 23.03.2012 в 10:07.
Ответить с цитированием
  #2  
Старый 23.03.2012, 10:56
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

можно разбить строки в какую-нибудь вложенную структуру, и упорядочить её
или regexp-ами или чем-другим привести к виду
001
006/001/003
008/001/б01
006/001/001
005
010
упорядочить stringlist-ом, и привести обратно к норм виду снова regexp-ами...
Ответить с цитированием
  #3  
Старый 23.03.2012, 16:49
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

PHP код:
// uses PerlRegEx


function sort(sstring): string;
var list: 
tstringlist;
begin
  
list := TStringList.Create;
  list.
Text := s;
  list.
Sort;
  
result := list.Text;
  list.
free;
end;


function 
regexp(subjpatternstring): TPerlRegEx;
begin
  result 
:= TPerlRegEx.Create;
  
result.regex := pattern;
  
result.subject := subj;
end;
function 
sub(strinstringoldpatternstringreplacerTPerlRegExReplaceEvent): stringoverload;
begin
  with regexp
(strinoldpattern) do begin
    onreplace 
:= replacer;
    
replaceall;
    
result := subject;
    
free
  end
end
;
function 
sub(strinstringoldpatternstring; new: string): stringoverload;
begin
  with regexp
(strinoldpattern) do begin
    replacement 
:= new;
    
replaceall;
    
result := subject;
    
free
  end
end
;


procedure TForm1.Button1Click(SenderTObject);
begin
  memo2
.Font.Name := 'courier';
  
memo2.Text := sub(memo1.text'\d+[а-я]?'form1.onreplace);
  
memo2.text := sort(memo2.text);
  
memo2.Text := sub(memo2.text'[ ]''');
  
memo2.Text := sub(memo2.text'([а-я])(\d+)''$2$1');
end;

procedure TForm1.onreplace(SenderTObject; var replacewithPCREString);
var 
regTPerlRegEx;
begin
  reg 
:= sender as TPerlRegEx;
  
replacewith := reg.replacement;
  
replacewith := Format('%05s', [reg.matchedtext]);
  if 
replacewith[length(replacewith)] in ['Ё''ё''А'..'я'then begin
    replacewith 
:= replacewith[length(replacewith)] + replacewith;
    
setlength(replacewithlength(replacewith) - 1)
  
end
end

Ответить с цитированием
  #4  
Старый 23.03.2012, 18:33
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию

еще можно просто сравнивать строки. строка "2" по умолчанию больше "1". "1/2" > "1/1" но меньше чем "2". соответственно вложенность по такому же принципу сама отсортируется. сортировку делать любым методом для чисел, хоть через массив, просто в ячейках массива будут строки, а не числа.
поправьте меня, если не так.

Последний раз редактировалось nixel, 23.03.2012 в 18:35.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:05.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter