Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1434709662
Дмитрий
2015-06-19 13:27
2017.02.26
обмен приложения с сервером mySQL


15-1458564457
ttUser
2016-03-21 15:47
2017.02.26
Как сделать, чтобы TTouchKeyboard не получала фокус


1-1348336174
crossmark
2012-09-22 21:49
2017.02.26
странный поток


2-1434957180
Djonik
2015-06-22 10:13
2017.02.26
idhttp json - авторизация qiwi


15-1458477503
MsGuns
2016-03-20 15:38
2017.02.26
Excel->MS SQL Server





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский