Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сортировка по убыванию [D7]


олямнап ©   (2015-06-21 16:34:00) 

Подскажите, пожалуйста, как в данном коде организовать сортировку количества символов по убыванию?

uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ToolWin, ComCtrls, Grids, ExtCtrls,  XPMan;

type
 TForm1 = class(TForm)
   StringGrid1: TStringGrid;
   Button1: TButton;
   Edit1: TEdit;
   procedure Button1Click(Sender: TObject);
   procedure StringGrid1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 k:string;
 a:char;   //символ
 b:integer;//кол-во символа "a" в строке
 c:integer;//количество различных символов
implementation

{$R *.dfm}

procedure clear;
begin
 Form1.StringGrid1.Cols[1].Clear;
 Form1.StringGrid1.Cols[2].Clear;
 Form1.StringGrid1.RowCount:=1;
 b:=0;
 c:=0;
end;

procedure TForm1.Button1Click(Sender: TObject);
 var i:integer;
begin
 clear;
 Form1.StringGrid1.Cells[0,c]:='Символ';
 Form1.StringGrid1.Cells[1,c]:='Количество';
 k:=Edit1.Text;
 while Length(k)<>0 do
   begin
     inc(c);
     a:=k[1];;
     b:=1;

     for i := 2 to Length(k) do
       if k[i]=a then inc(b);

     k:=StringReplace(k,a,'',[rfReplaceAll]);
     Form1.StringGrid1.Cells[0,c]:='"'+a+'"';
     Form1.StringGrid1.Cells[1,c]:=IntToStr(b);
   end;
 Form1.StringGrid1.RowCount:=c+1;
end;

procedure TForm1.StringGrid1Click(Sender: TObject);
begin

end;

end.


sniknik   (2015-06-22 10:45:00) [1]

> чуток другой совет.
для примера сортировки, но не копипасты (спецом не под задачу ТС, да там и невозможно исходных нет, кусок кривого кода в правильный не переделать...)
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Grids;

type
 TStringList = class(Classes.TStringList)
 protected
   function CompareStrings(const S1, S2: string): Integer; override;
 end;

 TForm1 = class(TForm)
   StringGrid1: TStringGrid;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
 public
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

function TStringList.CompareStrings(const S1, S2: string): Integer;
var
 i1, i2: integer;
begin
 i1:= StrToInt(Copy(S1, 1, Pos(';', S1)-1));
 i2:= StrToInt(Copy(S2, 1, Pos(';', S2)-1));
 if i1 < i2 then result:= 1
 else
   if i1 > i2 then result:= -1
   else result:= 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 i: integer;
 stList: TStringList;
begin
 stList:= TStringList.Create;
 try
   stList.Sorted:= true;

   stList.Text:=
     '2;2222'#13#10+
     '3;3333'#13#10+
     '4;4444'#13#10+
     '1;1111'#13#10+
     '10;1000'#13#10+
     '20;2000'#13#10+
     '40;4000'#13#10+
     '30;3000';

   StringGrid1.Enabled:= false;
   try
     StringGrid1.RowCount:= stList.Count + 1;

     StringGrid1.Cells[0, 0]:= 'Count';
     StringGrid1.Cells[1, 0]:= 'Value';

     for i:= 0 to stList.Count - 1 do
       StringGrid1.Rows[i+1].Text:= StringReplace(stList.Strings[i], ';', #13#10,[rfReplaceAll]);
   finally
     StringGrid1.Enabled:= true;
   end;
 finally
   stList.Free;
 end;
end;

end.


sniknik   (2015-06-22 09:53:00) [2]

> потом ведется серьезная обработка данных с использованием Cells как массива, я видел.
ты не одинок в этом, у меня похоже бывало http://bash.im/comics/20140730;)


MBo   (2015-06-22 08:52:00) [3]

>Даже если разработчики VCL уже создали такой массив в визуальном компоненте?
Я бы его использовал как вспомогательное хранилище. А вот хранения обрабатываемой информации в контроле постарался бы избегать - в данном случае это приведёт к сортировке строк грида, т.е. перелопачиванию свойств и (скорее всего) многократной перерисовке. Понятно, что для этой задачи расходы смешные, но хотелось бы, чтобы человек в принципе задумался.  
К сожалению, примеры того, как в грид грузят десятки мегабайт, потом ведется серьезная обработка данных с использованием Cells как массива, я видел.


sniknik   (2015-06-22 07:55:00) [4]

> чем его не устраивает массив Objects.
MBo же написал - он у визуального контрола (тем более это "пропертя", а не массив). -> не предназначен для хранения/обработки данных. не если тебя устраивает перерисовка "на каждый чих", тормоза из-за этого, не проблема, пользуйся.
но вот советы дистанцироваться от этого "массива", не хранить/не обрабатывать в нем данные не мешай давать... пусть даже на создание других массивов, хотя я, если заметил дал чуток другой совет.


Германн   (2015-06-22 02:24:00) [5]


> sniknik ©   (22.06.15 01:46) [3]
>
> и кстати там не такой массив.

Чем он "не такой"?
Может ты, Коля скажешь почему стоит заводить новый массив, вместо использования уже имеющегося массива Objects?
P.S. Уже не первый раз встречаюсь на форумах с советом создавать массив. Но никто пока не не объяснил мне чем его не устраивает массив Objects.


sniknik   (2015-06-22 01:46:00) [6]

пистолет вон тоже кто-то создал... и что теперь, прикладывать к виску и стреляться? а предназначен был для ограбления поездов и банков... ну, судя по фильмам. ;)

и кстати там не такой массив.
и еще кстати, лучше стринглист и процедуру кастомной сортировки к нему использовать, а не массив.


Германн   (2015-06-22 00:56:00) [7]


> MBo ©   (21.06.15 19:34) [1]
>
> 2. Завести массив CharCount: array[Char] of Integer и при
> проходе по строке делать Inc соотв. элемента
...
> 5. Не хранить данные в визуальных компонентах (2 пункт -
>  как правильное решение)

Даже если разработчики VCL уже создали такой массив в визуальном компоненте?


MBo   (2015-06-21 19:34:00) [8]

1. Для подобных вопросов предназначена конференция "Начинающим"
2. Завести массив CharCount: array[Char] of Integerи при проходе по строке делать Inc соотв. элемента
3. Найти максимальное значение в массиве, вывести в первую строку грида. Найти второе, вывести ниже и т.д.
4. Разобраться с методами формы и регулярными процедурами, не совать излишние   Form1., куда не следует.
5. Не хранить данные в визуальных компонентах (2 пункт - как правильное решение)


Наверх

Титульная страница Поиск, карта сайта Написать письмо