Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.07.2012, 08:15
Pcrepair
 
Сообщения: n/a
По умолчанию Сортировка строк. сложный случай

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

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

Вопрос: какими способами можно все это сделать? первое что приходит на ум это TStringList, там есть пары, но сам пока еще пробовал. возможно кто то что то знает, уже?
Ответить с цитированием
  #2  
Старый 27.07.2012, 08:37
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

я бы сделал так
Код:
StringList.AddObject('0000050', TMyObject.create(url))
//...
StringList.sort
дополнять нулями рейтинг можно при помощи format
TMyObject – посто хранитель url
__________________
>woweook<
Ответить с цитированием
  #3  
Старый 27.07.2012, 08:38
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от Pcrepair
пара "рейтинг - УРЛ"
в каком виде эти пары (набор пар) хранятся?
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #4  
Старый 27.07.2012, 14:52
Pcrepair
 
Сообщения: n/a
По умолчанию

есть две переменные. в одной число(рейтинг), в другой строка(УРЛ)
нужно их как то совместно сохранить (пара), потом в накопитель добавится еще несколько сот а может тысяч таких пар, после чего эти тыщщи пар нужно отсортировать по значению ЧИСЛО
Ответить с цитированием
  #5  
Старый 27.07.2012, 15:29
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
var
  AStringList: TStringList;

  function Compare(List: TStringList; Index1, Index2: Integer): Integer;
  begin
    if Integer(List.Objects[Index1])>Integer(List.Objects[Index2]) then Result:=1
    else if Integer(List.Objects[Index1])<Integer(List.Objects[Index2]) then Result:=-1
    else Result:=0;
  end;

begin
  AStringList:=TStringList.Create;
  AStringList.AddObject('http://www.apple.com/', Pointer(50));
  AStringList.AddObject('http://www.intorned.com/', Pointer(100));
  AStringList.AddObject('http://www.microsoft.com/', Pointer(75));
  AStringList.AddObject('http://www.ubuntu.com/', Pointer(25));
  AStringList.CustomSort(@Compare);
  Memo1.Lines.Assign(AStringList);
  AStringList.Free;
end;
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось NumLock, 27.07.2012 в 15:31.
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Pcrepair (27.07.2012)
  #6  
Старый 28.07.2012, 14:18
Pcrepair
 
Сообщения: n/a
По умолчанию

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

Код:
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.
Ответить с цитированием
  #7  
Старый 28.07.2012, 17:17
MiraLaklamon MiraLaklamon вне форума
Новичок
 
Регистрация: 07.06.2012
Сообщения: 59
Версия Delphi: 6, 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Pcrepair
вот что получилось в результате, правда пришлось ввести ГлобПерем в качестве буфера. некоторые считают что так неправильно. сразу встречный вопрос - как правильно?
В данном случае можно в класс формы вставить. Т.е.

Код:
type
  TForm1 = class(TForm)
...
  private
    { Private declarations }
    FBuffer: TStringList;  (*Поле класса TForm1 для хранения строк-пар*)
  public
    { Public declarations }
  end;
Ответить с цитированием
Этот пользователь сказал Спасибо MiraLaklamon за это полезное сообщение:
Pcrepair (28.07.2012)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:40.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter