Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.067 c
15-1339690335
alexdn
2012-06-14 20:12
2013.03.22
asp.net


2-1337169674
Дмитрий Белькевич
2012-05-16 16:01
2013.03.22
автоинкрементное поле в TClientDataSet


2-1336062569
pr20122012
2012-05-03 20:29
2013.03.22
ACCESS SQL UPDATE в зависимости от даты


15-1344801222
Jeer
2012-08-12 23:53
2013.03.22
Как молоды мы были...


2-1335703270
Vik
2012-04-29 16:41
2013.03.22
Создание текстовых файлов последовательно.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский