Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Перетасовка строк в списке

Delphi , Компоненты и Классы , Списки

Перетасовка строк в списке

Автор: Dimka Maslov
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Перетасовка строк в списке

Процедура тасует строки в списке.
List - Список строк
MoveCount - необязательный параметр, задающий количество перестановок,
если этот параметр опущен, либо меньше или равен нулю, его значение
принимается равным C*C-C, где C - количество строк в списке.

Зависимости: SysUtils, Classes
Автор:       Dimka Maslov, mainbox@endimus.ru, ICQ:148442121, Санкт-Петербург
Copyright:   Dimka Maslov
Дата:        18 ноября 2002 г.
***************************************************** }

procedure ShuffleStrings(List: TStrings; MoveCount: Integer = 0);
var
  i, N, C: Integer;
  Index1, Index2: Integer;
  Str: string;
  Obj: TObject;
begin
  List.BeginUpdate;
  try
    C := List.Count;
    N := MoveCount;
    if N <= 0 then
      N := C * C - C;
    for i := 0 to N do
    begin
      Index1 := Random(C);
      Index2 := Random(C);
      Str := List.Strings[Index1];
      Obj := List.Objects[Index1];
      List.Strings[Index1] := List.Strings[Index2];
      List.Objects[Index1] := List.Objects[Index2];
      List.Strings[Index2] := Str;
      List.Objects[Index2] := Obj;
    end;
  finally
    List.EndUpdate;
  end;
end;

Перевод контента на русский язык:

Процедура для перемешивания списка строк в Delphi! Давайте разбить ее и предложим некоторые улучшения.

Исходный код

Процедура ShuffleStrings принимает два параметра: List, который является объектом TStrings, и MoveCount, необязательное целое число, которое specifies количество обменов для выполнения. Если MoveCount не указано или равно 0 или меньше, оно по умолчанию устанавливается в произведение счета списка минус 1.

Процедура начинается с обновления списка для модификаций (используя BeginUpdate) и затем повторяется N раз (где N является либо указанным MoveCount, либо значением по умолчанию). В каждом цикле она генерирует два случайных индекса (Index1 и Index2) в диапазоне счета списка. Затем она обменивает строки и объекты на этих индексах с помощью присваиваний.

После цикла процедура заканчивает обновление (используя EndUpdate).

Улучшения

Вот несколько предложений для улучшения: 1. Используйте более описательное имя переменной: вместо Cconsider renaming it to something like ListCount. 2. Пространите расчет N: вместо использования N := C * C - C, вы можете использовать N := Max(0, MoveCount) + ListCount - 1. Это обеспечит, что N будет не менее 1 и не больше счета списка. 3. Используйте более эффективный генератор случайных чисел: текущая реализация использует функцию Random для генерации индексов. Хотя это работает, можно улучшить использованием функции RanGen32 из unit SysUtils, которая обеспечивает лучшую случайность. 4. Рассмотрите добавление обработки ошибок: если список пуст или пользователь указывает недопустимое значение MoveCount, вы можете добавить обработку ошибок для этих случаев.

Вот отредактированный код:

procedure ShuffleStrings(List: TStrings; MoveCount: Integer = 0);
var
  i, N, ListCount: Integer;
  Index1, Index2: Integer;
  Str: string;
  Obj: TObject;
begin
  List.BeginUpdate;
  try
    ListCount := List.Count;
    N := Max(0, MoveCount) + ListCount - 1;
    for i := 0 to N do
    begin
      Index1 := RanGen32(ListCount);
      Index2 := RanGen32(ListCount);
      Str := List.Strings[Index1];
      Obj := List.Objects[Index1];
      List.Strings[Index1] := List.Strings[Index2];
      List.Objects[Index1] := List.Objects[Index2];
      List.Strings[Index2] := Str;
      List.Objects[Index2] := Obj;
    end;
  finally
    List.EndUpdate;
  end;
end;

В целом, исходный код хорошо структурирован и легко читаем. Эти улучшения направлены на то, чтобы сделать его более эффективным, читаемым и надежным.

Процедура ShuffleStrings перемешивает строки в списке, количество перестановок задается параметром MoveCount или принимается равным квадрату количества строк в списке.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Списки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-08 17:54:50/0.0039870738983154/0