Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.01.2013, 14:46   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Вопрос Сорировка по алфавиту и по признаку в TList

Доброго времени суток!

Есть список элементов:
Название----Признак
--Арбуз--------2
--Ворота-------3
--Банан--------0
--Гольф--------1

Есть список где надо сортировать по алфавиту, и есть где надо сортировать по признаку.
Направление для сортировки по алфавиту: От а до я, сверху-вниз.
Т.е. и итоге список должен стать таким:
--Арбуз--------2
--Банан--------0
--Ворота-------3
--Гольф--------1


Направление для сортировки по признаку: От 0 до N, сверху-вниз.
Т.е. и итоге список должен стать таким:
--Банан--------0
--Гольф--------1
--Арбуз--------2
--Ворота-------3

Сейчас сортировка по алфавиту происходит так:
Код:
function TBaseList.SortFuncAlpha(Item1, Item2: Pointer): Integer;
var
  Data1, Data2: TBaseListItem;
  i: Integer;
begin
  Data1 := TBaseListItem(Item1);
  Data2 := TBaseListItem(Item2);
  if (Data1.Name < Data2.Name) then
    Result := -1;

  if (Data1.Name > Data2.Name) then
    Result := 1
  else
    Result := 0;
end;
Результат такой:
--Гольф--------1
--Арбуз--------2
--Банан--------0
--Ворота-------3

а потом такой:
--Гольф--------1
--Ворота-------3
--Банан--------0
--Арбуз--------2

Сейчас сортировка по признаку происходит так:
Код:
function TBaseList.SortFuncPriority(Item1, Item2: Pointer): Integer;
var
  Data1, Data2: TBaseListItem;
  i1, i2: Integer;
begin
  Data1 := TBaseListItem(Item1);
  Data2 := TBaseListItem(Item2);
  i1 := StrToInt(Data1.Priority);
  i2 := StrToInt(Data2.Priority);
  if (i1 < i2) then
    Result := -1;

  if (i1 > i2) then
    Result := 1
  else
    Result := 0;
end;
Результат такой:
--Гольф--------1
--Банан--------0
--Арбуз--------2
--Ворота-------3

а потом такой:
--Гольф--------1
--Арбуз--------2
--Банан--------0
--Ворота-------3


1 и 3 элементы не меняются
2 и 3 меняются только первый раз
2 и 4 меняются местами

ВСе это при обоих вариантах сортировки.

Как править?

Да в TList есть своя сортировка. Но мне нужна моя сортировка.
Человек_Борща вне форума Ответить с цитированием
Старый 17.01.2013, 15:20   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Может, дописать else в обеих сортировках?
Код:
if (Data1.Name < Data2.Name) then
  Result := -1
else
if (Data1.Name > Data2.Name) then
  Result := 1
else
  Result := 0;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.01.2013, 15:34   #3
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

TList сильно отличается от TListView? Могу дать пример сортировки для TListView.
Shouldercannon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дескриминация по национальному признаку Smitt&Wesson Свободное общение 29 14.03.2011 12:58
Требуется дописать программу С++ сорировка vaan.sk Общие вопросы C/C++ 2 10.03.2010 21:01
list сорировка по количеству слов в строке. Что не так? opensuse2008 Общие вопросы C/C++ 5 06.01.2010 21:56
Сложение по признаку???? Gadar Microsoft Office Excel 4 07.09.2009 19:27
Подсчет записей по какому-то признаку von-zibel Microsoft Office Access 1 07.06.2009 21:30