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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Показать 3 наивысших результата 
:(
    Опции темы
Dima85
Дата 20.3.2011, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



файл:
Код

Андрей=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 максимальных результата по убывающе.

Это сообщение отредактировал(а) Dima85 - 20.3.2011, 13:09
PM MAIL   Вверх
Keeper89
Дата 20.3.2011, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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


--------------------
PM MAIL WWW   Вверх
Dima85
Дата 20.3.2011, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



И как с этим работать? Я в этом не понимаю толком ничего.
PM MAIL   Вверх
salik
Дата 20.3.2011, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Надо в список добавить результаты, а потом его отсортировать.
PM MAIL   Вверх
Keeper89
Дата 20.3.2011, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну, например:
Код

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



--------------------
PM MAIL WWW   Вверх
Dima85
Дата 20.3.2011, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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


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


Эксперт
****


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

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



Нужно определять максимальный Item по числовому значению и его выводить?


--------------------
PM MAIL WWW   Вверх
Dima85
Дата 20.3.2011, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да. Необходимо вывести 3 максимальных значения по числовому значению.
PM MAIL   Вверх
Keeper89
Дата 20.3.2011, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

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]);



--------------------
PM MAIL WWW   Вверх
Dima85
Дата 20.3.2011, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо. Не думал что можно так упростить код, но мне необходимо немного другое. Как вывести не 1 а 3 максимальных результата по убыванию. Как сделать такой цикл?
PM MAIL   Вверх
Keeper89
Дата 20.3.2011, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Тогда можно их отсортировать следующим образом и вывести первые 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;


Это сообщение отредактировал(а) Keeper89 - 20.3.2011, 14:35


--------------------
PM MAIL WWW   Вверх
Qu1nt
Дата 20.3.2011, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Или так:
Код

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;

PM MAIL   Вверх
Dima85
Дата 20.3.2011, 15:00 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо

PM MAIL   Вверх
Dima85
Дата 19.9.2011, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

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 максимальных значения. Подскажите пожалуйста а как быть если необходимо наоборот вывести минимальные значения?

Это сообщение отредактировал(а) Dima85 - 19.9.2011, 23:29
PM MAIL   Вверх
Keeper89
Дата 19.9.2011, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Поменять d1 и d2 местами или цикл слелать от Count - 4 до Count - 1.


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

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

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

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

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


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

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


 




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


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

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