Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Сортировка строк. сложный случай   Найти похожие ветки 

 
Pcrepair ©   (2012-07-27 08:10) [0]

Добрый день. Есть четыре компонента:
1. Строка, содержит текстовый файл(точнее текстовая часть ХТМЛ-страницы)
2. Строка, содержит несколько слов (слова поиска)
3. Рейтинг(число), результат работы функции function Index(const S1,S2:string; A:integer):integer;
4. Строка - URL из которого получена ХТМЛ-страница

По ходу работы программы получается пара "рейтинг - УРЛ", текстовый файл и слова поиска УЖЕ не важны
необходимо эти пары (сотни а то и тысячи строк) отсортировать по возрастанию(или убыванию), по значению Рейтинг(число), причем после сортировки Рейтинг тоже уже не нужен. в конечном варианте нужны только строки УРЛ, отсортированные по Рейтингу

Вопрос: какими способами можно все это сделать? первое что приходит на ум это TStringList, там есть пары, но сам пока еще пробовал. возможно кто то что то знает, уже?


 
Anatoly Podgoretsky ©   (2012-07-27 08:46) [1]

> Pcrepair  (27.07.2012 08:10:00)  [0]

Случай очень, очень простой, метод с весьма необычным названием Sort


 
Плохиш ©   (2012-07-27 11:21) [2]

Гугля энд компани может спать спокойно :-)


 
Sha ©   (2012-07-27 11:49) [3]

> Pcrepair
> Сортировка строк. сложный случай


А чем он сложнее несложного случая?
Как сам себе ответишь, так все и поймешь.


 
Pcrepair ©   (2012-07-27 14:41) [4]

тут может не все поняли о чем речь идет. поясняю:
есть две переменные. в одной число(рейтинг), в другой строка(УРЛ)
нужно их как то совместно сохранить (пара), потом в накопитель добавится еще несколько сот а может тысяч таких пар, после чего эти тыщщи пар нужно отсортировать по значению ЧИСЛО


 
RWolf ©   (2012-07-27 14:45) [5]

Используй TObjectList и его метод Sort.


 
Плохиш ©   (2012-07-27 15:24) [6]


> Pcrepair ©   (27.07.12 14:41) [4]

TStringList прекрасно работает с парами "имя"="значение", даже имеет специальные свойства/методы.


 
Pcrepair ©   (2012-07-27 16:12) [7]

а ничего что имя=число и значение=строка? вот тут неясно. или число в строку?


 
Медвежонок Пятачок ©   (2012-07-27 16:17) [8]

ничего конечно.


 
Медвежонок Пятачок ©   (2012-07-27 16:18) [9]

или ты хочешь сказать, что если бы в стринглисте были бы не строки, то ты был бы счастлив?


 
Плохиш ©   (2012-07-27 16:20) [10]


> Pcrepair ©   (27.07.12 16:12) [7]

Зачем оно тебе, это программирование?


 
Pcrepair ©   (2012-07-27 17:05) [11]

чиста для прикола. небольшое интеллектуальное развлечение.
а чо?


 
Pcrepair ©   (2012-07-28 14:24) [12]

вот что получилось в результате, правда пришлось ввести ГлобПерем в качестве буфера. некоторые считают что так неправильно. сразу встречный вопрос - как правильно?


unit Unit1;

interface

uses
 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
 Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
 TForm1 = class(TForm)
   Memo1: TMemo;
   Button1: TButton;
   Edit1: TEdit;
   Edit2: TEdit;
   Label1: TLabel;
   Label2: TLabel;
   Button2: TButton;
   Memo2: TMemo;
   procedure Button1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 Buffer:TStringList;  (*ГлобПерем для хранения строк-пар*)

implementation

{$R *.dfm}

(*=======================================================*)
(*  28 июля 2012г. сортировка пары текст=число*)

(* ПРОЦ накопление строк в буфере*)
procedure TForm1.Button1Click(Sender: TObject);
var
 T1: TStringList;
 Text:string;     Number:integer;
(*  встроенная в процедуру функция. сшивает две ПЕРЕМ в одну  *)
 function AddUrl(const A:string; const B:integer):TStringList;
 begin
   AddUrl:=TStringList.Create;
   AddUrl.AddObject(Text,Pointer(Number));
 end;
(*ввод пар в накопитель*)
begin
   T1:=TStringList.Create;
   Number:=StrToInt(Edit1.Text); (*ввод числа*)
   Text:=Edit2.Text;  (*ввод текста*)
   T1:=AddUrl(Text,Number); (*сборка двух ПЕРЕМ в одну*)
   Buffer.AddStrings(T1); (*накопление строк в ГлобПерем*)
   Memo1.Text:=Buffer.text; (*контроль*)
   T1.Free;
end;
(*=====================================================*)

(*=====================================================*)
(* ПРОЦ сортировка строк из ГлобПерем*)
procedure TForm1.Button2Click(Sender: TObject);
var
 T: TStringList;

 function Compare(List: TStringList; Index1, Index2: Integer): Integer;
 begin
   if Integer(List.Objects[Index1])>Integer(List.Objects[Index2]) then Result:=-1
   (* сейчас сортировка - максимум наверху, если 1 а далее -1 тогда наверху минимум*)
   else if Integer(List.Objects[Index1])<Integer(List.Objects[Index2]) then Result:=1
   else Result:=0;
 end;

begin
  T:=TStringList.Create;
  T.AddStrings(Buffer); (*ввод накопленных пар*)
  T.CustomSort(@Compare); (*сортировка от 1 до максимума*)
  Memo2.Lines.Assign(T); (*контроль*)
  T.Free;
end;
(*====================================================*)
(*инизиализация буфера при запуске программы*)
procedure TForm1.FormCreate(Sender: TObject);
begin
 Buffer:=TStringList.Create;
end;

end.


 
Михаил   (2012-07-28 21:24) [13]

Зачем тебе вообще этот TStringList. Запихни это все в одномерный массив из указателей на упакованную запись из двух полей String и Integer.


type
 PPara = ^TPara;
 TPara = packed record
   url : String;
   rate: Integer;
end;

var
 List : array of PPara;


После этого отсортируй все это алгоритмом QuickSort.
В интернете методов реализации QuickSort полно.
Вот например этот.
http://otadmina.ru/quicksort/

Модифицируй его под запись естественно.


 
Михаил   (2012-07-28 21:45) [14]

Вот держи код модуля. Положишь на форму StringGrid и кнопку.
Было время, написал. Не ленись больше.


unit Unit1;

interface

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

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

// &#205;&#224;&#248;&#224; &#231;&#224;&#239;&#232;&#241;&#252; &#241; url &#232; &#240;&#229;&#233;&#242;&#232;&#237;&#227;&#238;&#236;
type
 PPara = ^TPara;
 TPara = packed record
   url : String;
   rate: Integer;
end;

var
 Form1: TForm1;
 List : array of PPara; // &#204;&#224;&#241;&#241;&#232;&#226; &#228;&#235;&#255; &#245;&#240;&#224;&#237;&#229;&#237;&#232;&#255; &#243;&#234;&#224;&#231;&#224;&#242;&#229;&#235;&#229;&#233; &#237;&#224; &#231;&#224;&#239;&#232;&#241;&#232;

implementation

{$R *.dfm}

procedure qSort(l,r:longint);
var i,j:longint;
   q:Integer;
   zam: PPara;
begin
 i := l; j := r;
 q := List[(l+r) div 2].rate;
 repeat
   while (List[i].rate < q) do inc(i);
   while (q < List[j].rate) do dec(j);
   if (i <= j) then
   begin
     zam:=List[i];
     List[i]:=List[j];
     List[j]:=zam;
     inc(i);
     dec(j);
   end;
 until (i > j);
 if (l < j) then qSort(l,j);
 if (i < r) then qSort(i,r);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 p: PPara;
 i, n: Integer;
begin
// &#199;&#224;&#239;&#243;&#241;&#234;&#224;&#229;&#236; &#195;&#209;&#215;
 Randomize;

// &#209;&#238;&#231;&#228;&#224;&#229;&#236; &#236;&#224;&#241;&#241;&#232;&#226; &#232;&#231; 10000 &#231;&#224;&#239;&#232;&#241;&#229;&#233; &#241; url &#232; &#240;&#229;&#233;&#242;&#232;&#237;&#227;&#238;&#236;
 SetLength(List, 10000);
 for i := 0 to High(List) do begin
   New(p);
   n := random(10000) + 1; // &#195;&#229;&#237;&#229;&#240;&#232;&#240;&#243;&#229;&#236; &#240;&#229;&#233;&#242;&#232;&#237;&#227; (&#238;&#242; 1 &#228;&#238; 10000)

   // &#199;&#224;&#239;&#232;&#241;&#251;&#226;&#224;&#229;&#236; &#240;&#229;&#243;&#242;&#232;&#237;&#227; &#232; url
   p.url := "url" + IntToStr(n);
   p.rate := n;
   List[i] := p;
 end;

// &#209;&#238;&#240;&#242;&#232;&#240;&#243;&#229;&#236; &#236;&#229;&#242;&#238;&#228;&#238;&#236; QuickSort
 qSort(0, High(List));

// &#194;&#251;&#226;&#238;&#228;&#232;&#236; &#226;&#241;&#254; &#253;&#242;&#243; &#245;&#229;&#240;&#252; &#226; StringGrid
// &#194;&#251;&#226;&#238;&#228;&#232;&#242;&#241;&#255; &#229;&#241;&#242;&#229;&#241;&#242;&#226;&#229;&#237;&#237;&#238; &#228;&#238;&#235;&#252;&#248;&#229; &#247;&#229;&#236; &#241;&#238;&#240;&#242;&#232;&#240;&#243;&#229;&#242;&#241;&#255;
 StringGrid1.ColCount := 2;
 StringGrid1.RowCount := 2;
 StringGrid1.FixedCols := 0;
 StringGrid1.Cells[0, 0] := "URL";
 StringGrid1.Cells[1, 0] := "&#208;&#229;&#233;&#242;&#232;&#237;&#227;";
 for i := 0 to High(List) do begin
   StringGrid1.Cells[0, i+1] := List[i].url;
   StringGrid1.Cells[1, i+1] := IntToStr(List[i].rate);
   StringGrid1.RowCount := StringGrid1.RowCount + 1;
 end;
 StringGrid1.RowCount := StringGrid1.RowCount - 1;
end;

end.


 
Михаил   (2012-07-28 21:47) [15]

Тут комменты на русском. А то там кракозябры вставились

unit Unit1;

interface

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

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

// Наша запись с url и рейтингом
type
 PPara = ^TPara;
 TPara = packed record
   url : String;
   rate: Integer;
end;

var
 Form1: TForm1;
 List : array of PPara; // Массив для хранения указателей на записи

implementation

{$R *.dfm}

procedure qSort(l,r:longint);
var i,j:longint;
   q:Integer;
   zam: PPara;
begin
 i := l; j := r;
 q := List[(l+r) div 2].rate;
 repeat
   while (List[i].rate < q) do inc(i);
   while (q < List[j].rate) do dec(j);
   if (i <= j) then
   begin
     zam:=List[i];
     List[i]:=List[j];
     List[j]:=zam;
     inc(i);
     dec(j);
   end;
 until (i > j);
 if (l < j) then qSort(l,j);
 if (i < r) then qSort(i,r);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 p: PPara;
 i, n: Integer;
begin
// Запускаем ГСЧ
 Randomize;

// Создаем массив из 10000 записей с url и рейтингом
 SetLength(List, 10000);
 for i := 0 to High(List) do begin
   New(p);
   n := random(10000) + 1; // Генерируем рейтинг (от 1 до 10000)

   // Записываем реутинг и url
   p.url := "url" + IntToStr(n);
   p.rate := n;
   List[i] := p;
 end;

// Сортируем методом QuickSort
 qSort(0, High(List));

// Выводим всю эту херь в StringGrid
// Выводится естественно дольше чем сортируется
 StringGrid1.ColCount := 2;
 StringGrid1.RowCount := 2;
 StringGrid1.FixedCols := 0;
 StringGrid1.Cells[0, 0] := "URL";
 StringGrid1.Cells[1, 0] := "Рейтинг";
 for i := 0 to High(List) do begin
   StringGrid1.Cells[0, i+1] := List[i].url;
   StringGrid1.Cells[1, i+1] := IntToStr(List[i].rate);
   StringGrid1.RowCount := StringGrid1.RowCount + 1;
 end;
 StringGrid1.RowCount := StringGrid1.RowCount - 1;
end;

end.


 
Pcrepair ©   (2012-07-29 09:42) [16]

Спасибо, НО....
визуальный компонент не подходит, хотя заманчиво, заманчиво
до изучения record пока еще не дошел, пока немного знаком с TStringList его и использую


 
Inovet ©   (2012-07-29 10:15) [17]

> [16] Pcrepair ©   (29.07.12 09:42)
> до изучения record пока еще не дошел

Это основы, однако, а лезешь в более сложное.


 
Dimka Maslov ©   (2012-07-29 10:24) [18]

Типы данных, массивы, записи и сортировка структурированных данных является одной из основ обучения программированию. С этого надо начинать. Если до сих пор не начал - пора заканчивать, брать лопату и идти копать.


 
Ega23 ©   (2012-07-29 11:00) [19]


> Зачем тебе вообще этот TStringList. Запихни это все в одномерный
> массив из указателей на упакованную запись из двух полей
> String и Integer.


А TStringList - это, по-твоему, что?


 
Pcrepair ©   (2012-07-29 11:57) [20]

Удалено модератором
Примечание: На ринг


 
Михаил   (2012-07-29 11:59) [21]


> Спасибо, НО....
> визуальный компонент не подходит, хотя заманчиво, заманчиво
> до изучения record пока еще не дошел, пока немного знаком
> с TStringList его и использую


Что значит визуальный компонент? Я тебе реализовал в массиве из указателей. Просто для того чтобы был виден результат вывел в StringList. Можешь и не выводить


 
Михаил   (2012-07-29 12:02) [22]


> А TStringList - это, по-твоему, что?


TStringList - это массив строк со своими функциями сортировки. А ему же нужен массив объектов из двух полей url и rating. Можно тогда просто TList использовать и запихивать туда нужные объекты. Вобщем вариантов реализации много. Кто на что горазд.


 
Михаил   (2012-07-29 12:03) [23]


> [21]


Т.е. вывел в StringGrid))) а не в StringList


 
Плохиш ©   (2012-07-29 12:55) [24]


> Михаил   (29.07.12 12:02) [22]
>
> > А TStringList - это, по-твоему, что?
>
>
> TStringList - это массив строк со своими функциями сортировки.

Мелкое у тебя представление о н&#235;м. Даже справка над тобой сме&#235;тся.


 
Ega23 ©   (2012-07-29 13:37) [25]


> TStringList - это массив строк со своими функциями сортировки.
>  А ему же нужен массив объектов из двух полей url и rating.
>  Можно тогда просто TList использовать и запихивать туда
> нужные объекты. Вобщем вариантов реализации много. Кто на
> что горазд.


А мужики-то не знают...


 TStringList = class;

 PStringItem = ^TStringItem;
 TStringItem = record
   FString: string;
   FObject: TObject;
 end;

 PStringItemList = ^TStringItemList;
 TStringItemList = array[0..MaxListSize] of TStringItem;
 TStringListSortCompare = function(List: TStringList; Index1, Index2: Integer): Integer;

 TStringList = class(TStrings)
 private
   FList: PStringItemList;


Не вижу никакого массива строк. Вижу массив рекордов TStringItem



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.053 c
15-1335541656
brother
2012-04-27 19:47
2013.03.22
Win 98


15-1343893780
Wadimka
2012-08-02 11:49
2013.03.22
Подскажите куда копать


2-1336222680
Глеб
2012-05-05 16:58
2013.03.22
Редактирование надписей в компоненте едит


15-1339139460
Дмитрий С
2012-06-08 11:11
2013.03.22
Что это слили?


15-1336509003
Юрий
2012-05-09 00:30
2013.03.22
С днем рождения ! 9 мая 2012 среда