Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Сортировка строк в ListBox


Автор: GQU 23.6.2012, 01:37
Код

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)Теперь все повторяется, только сравниваем все строки с третьей до предпоследней
 

Автор: Bodro 23.6.2012, 17:34
Добрый день!

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

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

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;
      }
    }
  }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)