Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка строк. сложный случай, Сортировка строк. сложный случай 
:(
    Опции темы
Pcrepair
Дата 27.7.2012, 07:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



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

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

Вопрос: какими способами можно все это сделать? первое что приходит на ум это TStringList, там есть пары, но сам пока еще пробовал. возможно кто то что то знает, уже?
--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
DarkProg
Дата 27.7.2012, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: 4
Всего: 19



Если в лоб, то просто пишете свой record где описываете все необходимые вам поля. Потом делаете массив этих записей. Потом пишите любую сортировку(на ваш вкус), только при сортировке в качестве критерия выбираете конкретное поле.


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
БелАмор
Дата 27.7.2012, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 10.6.2010
Где: Россия

Репутация: 7
Всего: 17



Цитата(Pcrepair @  27.7.2012,  07:12 Найти цитируемый пост)
Вопрос: какими способами можно все это сделать?

Вариантов - вагон и маленькая тележка...

Цитата(DarkProg @  27.7.2012,  11:20 Найти цитируемый пост)
Потом пишите любую сортировку(на ваш вкус),

Не согласен. Я считаю, что следует по максимуму использовать то, что уже имеется.
В VCL сортировку умеют делать, в частности, TList, TObjectList, TStringList.
Использовать TStringList можно, причём в нескольких вариантах, но, на мой взгляд, в данном случае это неоптимально.
Быстрее всего ваши данные уже лежат в каком-то хранилище. Бысрее всего это динамический массив структур (записей).
В этом случае можно создать TList и заполнить его указателями на эти структуры. При этом следует иметь в виду, что до окончания работы с указателями массив не должен пересраспределяться, в частности не должен меняться его размер.
Далее пишется функция (не метод) сравнения двух структур (одна строчка) и вызывается метод Sort. Всё. в TList находится отсортированный список указателей на ваши структуры.

PM   Вверх
Pcrepair
Дата 28.7.2012, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



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

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.

--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
DarkProg
Дата 28.7.2012, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: 4
Всего: 19



Правильно, отправить в описание класса формы, в зависимости от необходимой видимости объекта для других классов и наследников в секцию private или public.

Код

Type
 TForm1=class(TForm)
 
 public
  StrList:TStringList; //сюда
 private
  StrList:TStringList; //или сюда
end; 


А разрушать и создавать, удобно в событиях OnCreate и OnDestroy у формы. Главное чтобы внутри нигде не сделали создание объекта повторно.


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
БелАмор
Дата 28.7.2012, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 10.6.2010
Где: Россия

Репутация: 7
Всего: 17



Цитата(Pcrepair @  28.7.2012,  13:31 Найти цитируемый пост)
вот что получилось в результате

Код, мягко говоря, очень далёк от идеального. Если подробно объяснять все недочёты, можно написать целую книгу. Вместо этого я приведу более корректный вариант того, что вы хотели реализовать. Будут вопросы - спрашивайте.

Код

unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FList := TStringList.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FList.Free;
end;

{ Для сортировки по возрастанию }
function CompareAsc(AList: TStringList; Index1, Index2: Integer): Integer;
begin
  Result := Integer(AList.Objects[Index1]) - Integer(AList.Objects[Index2]);
  if Result = 0 then
    Result := CompareStr(AList[Index1], AList[Index2]);
end;

{ Для сортировки по убыванию }
function CompareDesc(AList: TStringList; Index1, Index2: Integer): Integer;
begin
  Result := - CompareAsc(AList, Index1, Index2);
end;

procedure TForm1.Button1Click(Sender: TObject);
(*ввод пар в накопитель*)
begin
    FList.AddObject(Edit2.Text, Pointer(StrToInt(Edit1.Text)));
    Memo2.Text:=FList.text;
end;

{ Сортировка по возрастанию }
procedure TForm1.Button2Click(Sender: TObject);
begin
   FList.CustomSort(@CompareAsc);
   Memo2.Lines.Assign(FList);
end;

{ Сортировка по убыванию }
procedure TForm1.Button3Click(Sender: TObject);
begin
   FList.CustomSort(@CompareDesc);
   Memo2.Lines.Assign(FList);
end;

{ Заполнение списка тестовыми данными }
procedure TForm1.Button4Click(Sender: TObject);
begin
  FList.AddObject('Пять (3)', Pointer(5));
  FList.AddObject('Восемь (1)', Pointer(8));
  FList.AddObject('Один', Pointer(1));
  FList.AddObject('Два', Pointer(2));
  FList.AddObject('Пять (2)', Pointer(5));
  FList.AddObject('Восемь (2)', Pointer(8));
  FList.AddObject('Семь', Pointer(7));
  FList.AddObject('Девять', Pointer(9));
  FList.AddObject('Шесть', Pointer(6));
  FList.AddObject('Три', Pointer(3));
  FList.AddObject('Четыре', Pointer(4));
  FList.AddObject('Пять (1)', Pointer(5));
  Memo2.Lines.Assign(FList);
end;

end.


Хотел бы только ещё добавить, что идея хранить рабочие данные в StringList крайне неудачна по нескольким причинам:

1. В реальности у вас данных больше, чем одна строка и одно число.
2. Нестандартное использование указателя для хранения целого числа. Без крайней необходимости такое делать не стоит. Крайней необходимости в данном случае не наблюдается. Все средства следует стараться использовать максимально штатным образом. При нестандартном использовании чего-либо всегда есть вероятность нарваться на неожиданную проблему. Например, на такую: http://delphikingdom.com/asp/viewitem.asp?catalogid=1035

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.5190 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.