Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Правильная сортировка TListBox, подскажите 
:(
    Опции темы
YURIC
Дата 22.10.2005, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 5.8.2003

Репутация: нет
Всего: 1



Здарствуйте уважаемые,

Подскажите как сделать правильную соритровку листбокса, т.е. чтобы строки правилно сортировались, а не так как там по дефульту.

Есть

Lisbox1.Sorted:=true;
Результат:

Код

АБВ - 13
АБВ - 14
АБВ - 15
АБВ - 7
АБВ - 9


Надо

Lisbox1.Sorted:=true;
Результат:

Код

АБВ - 7
АБВ - 9
АБВ - 13
АБВ - 14
АБВ - 15


Подскажите...

Это сообщение отредактировал(а) YURIC - 22.10.2005, 18:40
PM MAIL   Вверх
Quadr0
Дата 22.10.2005, 19:37 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 15.7.2011, 02:23
  Вверх
Самурай
Дата 22.10.2005, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 20.10.2005
Где: Воронежская облас ть > Семилуки

Репутация: 1
Всего: 1



Мысли вслух:
Находить начало цифр в двух сравниваемых строках, т. е. на одном и том же индексе стоит число, а перед этим числом не символ-число (минус учитываем). Далее мы получаем числа в каждой строке. Меньшее по количеству цифрчислро дополняем до количества цифр в другом путем приписывания в конец нулей. Дальеш стравниваем числа. Та строка, в которой большее число, будет стоять ниже другой. Итого простая ручная сортировка. Примечание: если у нас числа оказались одинаковыми, то ниже будет стоять строка, в которую мы не добавляли нули. По-моему этот алгоритм достаточно просто реализовать, и он должен сработать к приведенному примеру.
PM MAIL ICQ   Вверх
Самурай
Дата 22.10.2005, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 20.10.2005
Где: Воронежская облас ть > Семилуки

Репутация: 1
Всего: 1



Кое-что написал. Проверил - работает на нескольких вариантах.
Код

function CompareStr(s1, s2:string):integer;
var
 i1,i2: integer;
 b: boolean;
 add: integer;
begin
 Result:=-1;
 while (s1 <> '') and (s2 <> '') do
  begin
   if (s1[1] in ['0'..'9']) and (s2[1] in ['0'..'9'])
    then
     begin
      i1:=StrToInt(s1[1]);
      Delete(s1, 1, 1);
      if s1 = ''
       then
        s1:= ' ';
      while (s1[1] in ['0'..'9']) and (Length(s1) > 1) do
       begin
        i1:=i1 * 10 + StrToInt(s1[1]);
        Delete(s1, 1, 1);
       end;
      if s1[1] in ['0' ..'9']
       then
        begin
         i1:=i1 + 10 + StrToInt(s1[1]);
         Delete(s1, 1, 1);
        end;
      i2:=StrToInt(s2[1]);
      Delete(s2, 1, 1);
      if s2 = ''
       then
        s2:= ' ';
      while (s2[1] in ['0'..'9']) and (Length(s2) > 1) do
       begin
        i2:=i2 * 10 + StrToInt(s2[1]);
        Delete(s2, 1, 1);
       end;
      if s2[1] in ['0' ..'9']
       then
        begin
         i2:=i2 + 10 + StrToInt(s2[1]);
         Delete(s2, 1, 1);
        end;
      add:=-1;
      while Length(IntToStr(i1)) <> Length(IntToStr(i2)) do
       if Length(IntToStr(i1)) < Length(IntToStr(i2))
        then
         begin
          i1:=i1*10 + 0;
          add:=2;
         end
        else
         begin
          i2:=i2*10 + 0;
          add:=1;
         end;
      if i1 > i2
       then
        Result:=1
       else
        if i1 < i2
         then
          Result:=2;
      if add <> -1
       then
        Result:=add
     end;
   Delete(s1, 1, 1);
   Delete(s2, 1, 1);
  end;
end;

procedure Change(i,j: integer; var st: TStrings);
var
 buf: string;
begin
 buf:=st[i];
 st[i]:=st[j];
 st[j]:=buf;
end;

function Invert(i: TStrings):TStrings;
var
 j:integer;
 buf: TstringList;
begin
 buf:=TStringList.Create;
 for j:=i.Count-1 downto 0 do
  buf.Add(i[j]);
 Result:=buf;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 i, j: integer;
 buf: string;
 cs: integer;
 b, it: TStrings;
begin
 with ListBox1 do
  for i:=0 to Items.Count-1 do
   for j:=0 to Items.Count-2 do
    begin
     it:=Items;
     cs:=CompareStr(Items[j], Items[j+1]);
     if cs = -1
      then
       begin
        if Items[j] < Items[j+1]
         then
          Change(j, j+1, it)
       end
      else
       if cs = 2
        then
         Change(j, j+1, it)
    end;
 ListBox1.Items:=Invert(ListBox1.Items);
end;

Добавлено @ 20:22
Предложенный пример сортируется...
PM MAIL ICQ   Вверх
YurikGL
Дата 22.10.2005, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 5.7.2005
Где: Уфа

Репутация: нет
Всего: 2



ИМХО все намного проще....
Я бы написал функцию типа

Код

Function GetNumber(Inputst:string):integer;
var
stvr:string;
i:integer;
begin
i:=length(Inputst);
while (Inputst[i] in ['0'..'9']) and (i>0) do begin
  stvr:=Inputst[i]+stvr;
  dec(i);
  end;
if stvr='' then GetNumber:=0
           else GetNumber:=StrToInt(stvr);
end;


Она возвращает число, которое находится в конце строки.

Далее сортировал бы
Код

var
i,j:integer;
St:string;
begin
For i:=0 to Memo1.Lines.Count-2 do
  For j:=i+1 to Memo1.Lines.Count-1 do
    if GetNumber(Memo1.Lines[i])>GetNumber(Memo1.Lines[j])
       then begin
          st:=Memo1.Lines[i];
          Memo1.Lines[i]:=Memo1.Lines[j];
          Memo1.Lines[j]:=st;
            end;
end

--------------------
 
PM MAIL WWW ICQ   Вверх
Самурай
Дата 22.10.2005, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 20.10.2005
Где: Воронежская облас ть > Семилуки

Репутация: 1
Всего: 1



Цитата(YurikGL @ 22.10.2005, 21:48)
ИМХО все намного проще....

Если отталкиваться именно от примера.
А если вдруг последние символы - не цифры, т. е. сортировка должна проходить по внутренним циферкам?
PM MAIL ICQ   Вверх
YurikGL
Дата 22.10.2005, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 5.7.2005
Где: Уфа

Репутация: нет
Всего: 2



Цитата
А если вдруг последние символы - не цифры, т. е. сортировка должна проходить по внутренним циферкам?

Тогда если надо все цифры вытащить то переделываем

Код

Function GetNumber(Inputst:string):integer;
var
stvr:string;
i:integer;
begin
i:=length(Inputst);
while i>0 do begin
  if (Inputst[i] in ['0'..'9']) then  stvr:=Inputst[i]+stvr;
  dec(i);
  end;
if stvr='' then GetNumber:=0
           else GetNumber:=StrToInt(stvr);
end;


Если нужно последнюю последовательность вытащить то

Код

Function GetNumber(Inputst:string):integer;
var
stvr:string;
i:integer;
begin
i:=length(Inputst);
while i>0 do begin
  if (Inputst[i] in ['0'..'9']) then stvr:=Inputst[i]+stvr;
  dec(i);
  if not (Inputst[i] in ['0'..'9']) and (stvr<>'') then break;
  end;
if stvr='' then GetNumber:=0
           else GetNumber:=StrToInt(stvr);
end;


Алгоритм сортировки остается без изменений
--------------------
 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0538 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.