Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Показать 3 наивысших результата


Автор: Dima85 20.3.2011, 13:08
файл:
Код

Андрей=23
Володя=33
Дима=43
Аня=22

 
Код

  for i := 1 to stringBuff.count-1 do begin
  ti:=TStringList.create; //создаём класс
  ti.text:=stringReplace(stringBuff[i],'=',#13#10,[rfReplaceAll]);

    if v<strtoint(ti[1]) then begin
      v:=strtoint(ti[1]);
      max1:='1) '+ti[0]+' у него '+ti[1]; // записываем результат в переменную
    end;

  ti.free;
    end;


Приведенный мой пример выводит только 1 максимальный результат. Подскажите пожалуйста возможно ли каким-то простым решением выводить 3 максимальных результата по убывающе.

Автор: Keeper89 20.3.2011, 13:19
Вообще для этого ничего считывать не надо, и если файл хранится в stringBuff, все значения уже есть в Names и Values.

Автор: Dima85 20.3.2011, 13:23
И как с этим работать? Я в этом не понимаю толком ничего.

Автор: salik 20.3.2011, 13:31
Надо в список добавить результаты, а потом его отсортировать.

Автор: Keeper89 20.3.2011, 13:32
Ну, например:
Код

with TStringList.Create do
  try
    Add('Вася=1');
    Showmessage(Names[0]); // Будет "Вася"
    Showmessage(Values[0]); // Будет "1"
  finally
    Free;
  end;

Автор: Dima85 20.3.2011, 13:37
А нельзя ли в моем примере как-то сохранять в переменную число которое было максимальное до того как выяснилось самое максимальное число а потом выводить?

Туфталогия получилось. Но надеюсь понятно что я хотел сказать.


Автор: Keeper89 20.3.2011, 13:56
Нужно определять максимальный Item по числовому значению и его выводить?

Автор: Dima85 20.3.2011, 14:05
Да. Необходимо вывести 3 максимальных значения по числовому значению.

Автор: Keeper89 20.3.2011, 14:07
Код

var
  i, max: Integer;
begin
  max := 0;
  for i := 1 to stringBuff.Count - 1 do
    if stringBuff.ValueFromIndex[i] > stringBuff.ValueFromIndex[max] then
      max := i;
  ShowMessage(stringBuff[max]);

Автор: Dima85 20.3.2011, 14:20
Спасибо. Не думал что можно так упростить код, но мне необходимо немного другое. Как вывести не 1 а 3 максимальных результата по убыванию. Как сделать такой цикл?

Автор: Keeper89 20.3.2011, 14:35
Тогда можно их отсортировать следующим образом и вывести первые 3 в цикле:
Код

function CompareWithValues(List: TStringList; Index1, Index2: Integer): Integer;
var
  d1, d2: Integer;
begin
  d1 := StrToInt(List.ValueFromIndex[Index1]);
  d2 := StrToInt(List.ValueFromIndex[Index2]);
  if d1 > d2 then
    Result := -1
  else if d1 < d2 then
    Result := 1
  else
    Result := 0;
end;

procedure TForm1.btn1Click(Sender: TObject);
var
  i: Integer;
  stringBuff: TStringList;
begin
  stringBuff := TStringList.Create;
  try
    // Загружаем значения
    // Сортируем по убыванию
    stringBuff.CustomSort(CompareWithValues);
    for i := 1 to 3 do
      ShowMessage(stringBuff[i-1]);
  finally
    Free;
  end;
end;

Автор: Qu1nt 20.3.2011, 14:52
Или так:
Код

uses
  Math;

function CompareValues(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result := - CompareValue(StrToInt(List.ValueFromIndex[Index1]), StrToInt(List.ValueFromIndex[Index2]));
end;

procedure TMainForm.Button1Click(Sender: TObject);
begin
  with TStringList.Create do
  try
    DelimitedText := 'Андрей=23, Володя=33, Дима=43, Аня=22';
    CustomSort(CompareValues);
    ShowMessage(Strings[0]);
    ShowMessage(Strings[1]);
    ShowMessage(Strings[2]);
  finally
    Free;
  end;
end;

Автор: Dima85 20.3.2011, 15:00
Спасибо

Автор: Dima85 19.9.2011, 23:26
Код

function CompareWithValues(List: TStringList; Index1, Index2: Integer): Integer;
var
  d1, d2: Integer;
begin
  d1 := StrToInt(List.ValueFromIndex[Index1]);
  d2 := StrToInt(List.ValueFromIndex[Index2]);
  if d1 > d2 then
    Result := -1
  else if d1 < d2 then
    Result := 1
  else
    Result := 0;
end;

procedure TForm1.btn1Click(Sender: TObject);
var
  i: Integer;
  stringBuff: TStringList;
begin
  stringBuff := TStringList.Create;
  try
    // Загружаем значения
    // Сортируем по убыванию
    stringBuff.CustomSort(CompareWithValues);
    for i := 1 to 3 do
      ShowMessage(stringBuff[i-1]);
  finally
    Free;
  end;
end;



Таким образом можно найти и вывести 3 максимальных значения. Подскажите пожалуйста а как быть если необходимо наоборот вывести минимальные значения?

Автор: Keeper89 19.9.2011, 23:59
Поменять d1 и d2 местами или цикл слелать от Count - 4 до Count - 1.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)