Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка строк в ListBox 
:(
    Опции темы
GQU
Дата 23.6.2012, 01:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

void __fastcall TForm1::Button4Click(TObject *Sender)
{
for(int j=0;j<ListBox1->Items->Count-1;j++){
    for(int i=0;i<ListBox1->Items->Count;i++){
    if (ListBox1->Items->Strings[j].Length()>ListBox1->Items->Strings[i].Length()){
    String min=ListBox1->Items->Strings[i];
    ListBox1->Items->Strings[i]=ListBox1->Items->Strings[j];
    ListBox1->Items->Strings[j]=min;
}
}

}
}


Не пойму почему не работает сортировка строк по длине
Алгоритм примерно такой:
1) Сравниваем все строки с первой
2)Если есть строки короче чем первая, меняем местами первую и которую короче первой
3)На данном этапе на первом месте должна стоять самая короткая строка

4)Теперь все повторяется, только сравниваем все строки со второй и меняем вторую и которая короче второй
итд

5)Теперь все повторяется, только сравниваем все строки с третьей до предпоследней
 

Это сообщение отредактировал(а) GQU - 23.6.2012, 01:40
PM MAIL   Вверх
Bodro
Дата 23.6.2012, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Добрый день!

Во-первых, перепишите свои циклы - вынесите за пределы цикла вычисления:
Код

// Как назвать переменные - придумайте сами

int size1 = ListBox1->Items->Count - 1;
int size = ListBox1->Items->Count;

Это совет по оптимизации.

Так, теперь перейдём к вашей проблеме.

Вариант №1 - не очень удачный, содержит 2 наших цикла и ещё цикл внутри STL.
Код

#include <vector>
#include <algorithm>
#include <functional>

/* ... */
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  int count = ListBox1->Items->Count;
  std::vector<UnicodeString> storage = std::vector<UnicodeString>(count);

  for(int i = 0 ; i < count; i++)
  {
    storage[i] = ListBox1->Items->Strings[i];
  }

  std::stable_sort(storage.begin(), storage.end(), std::greater<UnicodeString>());

  for(int i = 0 ; i < count; i++)
  {
    ListBox1->Items->Strings[i] = storage[i];
  }
}

Вместо предиката greather можете использовать предикат less или написать свой (если не знаете, то читайте как пишутся функторы).

Вариант №2 - сортировка методом пузырька.
Код

void __fastcall TForm1::Button2Click(TObject *Sender)
{
  int count = ListBox1->Items->Count;

  for(int j = 0; j < count; j++)
  {
    for(int i = j + 1; i < count; i++)
    {
      if(ListBox1->Items->Strings[j] > ListBox1->Items->Strings[i])
      {
        UnicodeString t = ListBox1->Items->Strings[i];
        ListBox1->Items->Strings[i] = ListBox1->Items->Strings[j];
        ListBox1->Items->Strings[j] = t;
      }
    }
  }
}

И последний вариант - выставить в инспекторе объектов свойство Sorted у ListBox в true.

Вот если вас интересует сравнение конкретно по длине, то опять таки, воспользуйтесь сортировкой пузырьком, только сравнивайте не строки, а их длину.
Код

void __fastcall TForm1::Button3Click(TObject *Sender)
{
  int count = ListBox1->Items->Count;

  for(int j = 0 ; j < count; j++)
  {
    for(int i = j + 1 ; i < count; i++)
    {
      if(ListBox1->Items->Strings[j].Length() > ListBox1->Items->Strings[i].Length())
      {
        UnicodeString t = ListBox1->Items->Strings[i];
        ListBox1->Items->Strings[i] = ListBox1->Items->Strings[j];
        ListBox1->Items->Strings[j] = t;
      }
    }
  }
}


Это сообщение отредактировал(а) Bodro - 23.6.2012, 18:09
PM MAIL WWW ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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