Форум: "Начинающим";
Текущий архив: 2017.02.26;
Скачать: [xml.tar.bz2];
ВнизСортировка по убыванию Найти похожие ветки
← →
олямнап (2015-06-21 16:34) [0]Подскажите, пожалуйста, как в данном коде организовать сортировку количества символов по убыванию?
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.
← →
MBo © (2015-06-21 19:34) [1]1. Для подобных вопросов предназначена конференция "Начинающим"
2. Завести массивCharCount: array[Char] of Integer
и при проходе по строке делать Inc соотв. элемента
3. Найти максимальное значение в массиве, вывести в первую строку грида. Найти второе, вывести ниже и т.д.
4. Разобраться с методами формы и регулярными процедурами, не совать излишние Form1., куда не следует.
5. Не хранить данные в визуальных компонентах (2 пункт - как правильное решение)
← →
Германн © (2015-06-22 00:56) [2]
> MBo © (21.06.15 19:34) [1]
>
> 2. Завести массив CharCount: array[Char] of Integer и при
> проходе по строке делать Inc соотв. элемента
...
> 5. Не хранить данные в визуальных компонентах (2 пункт -
> как правильное решение)
Даже если разработчики VCL уже создали такой массив в визуальном компоненте?
← →
sniknik © (2015-06-22 01:46) [3]пистолет вон тоже кто-то создал... и что теперь, прикладывать к виску и стреляться? а предназначен был для ограбления поездов и банков... ну, судя по фильмам. ;)
и кстати там не такой массив.
и еще кстати, лучше стринглист и процедуру кастомной сортировки к нему использовать, а не массив.
← →
Германн © (2015-06-22 02:24) [4]
> sniknik © (22.06.15 01:46) [3]
>
> и кстати там не такой массив.
Чем он "не такой"?
Может ты, Коля скажешь почему стоит заводить новый массив, вместо использования уже имеющегося массива Objects?
P.S. Уже не первый раз встречаюсь на форумах с советом создавать массив. Но никто пока не не объяснил мне чем его не устраивает массив Objects.
← →
sniknik © (2015-06-22 07:55) [5]> чем его не устраивает массив Objects.
MBo же написал - он у визуального контрола (тем более это "пропертя", а не массив). -> не предназначен для хранения/обработки данных. не если тебя устраивает перерисовка "на каждый чих", тормоза из-за этого, не проблема, пользуйся.
но вот советы дистанцироваться от этого "массива", не хранить/не обрабатывать в нем данные не мешай давать... пусть даже на создание других массивов, хотя я, если заметил дал чуток другой совет.
← →
MBo © (2015-06-22 08:52) [6]>Даже если разработчики VCL уже создали такой массив в визуальном компоненте?
Я бы его использовал как вспомогательное хранилище. А вот хранения обрабатываемой информации в контроле постарался бы избегать - в данном случае это приведёт к сортировке строк грида, т.е. перелопачиванию свойств и (скорее всего) многократной перерисовке. Понятно, что для этой задачи расходы смешные, но хотелось бы, чтобы человек в принципе задумался.
К сожалению, примеры того, как в грид грузят десятки мегабайт, потом ведется серьезная обработка данных с использованием Cells как массива, я видел.
← →
sniknik © (2015-06-22 09:53) [7]> потом ведется серьезная обработка данных с использованием Cells как массива, я видел.
ты не одинок в этом, у меня похоже бывало http://bash.im/comics/20140730 ;)
← →
sniknik © (2015-06-22 10:45) [8]> чуток другой совет.
для примера сортировки, но не копипасты (спецом не под задачу ТС, да там и невозможно исходных нет, кусок кривого кода в правильный не переделать...)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.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2017.02.26;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.001 c