Показать сообщение отдельно
  #13  
Старый 27.09.2012, 21:13
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, в принципе, можно и так изгаляться.
Но есть вариант попроще.
1. Создаем 2 служебных списка.
2. В один список кладем все положительные числа.
3. Во второй - все отрицательные.
4. Сортируем списки, если надо.
5. Делаем проверку, что нужную последовательность вообще можно составить (число элементов в обоих списках должно быть одинаковым)
6. Составляем новый список, поочередно беря элементы из служебных.
Код:
var
  I : Integer;
  P, N : Array Of Integer;
  D : Integer;
begin
  // Prepare
  SetLength(P,0);
  SetLength(N,0);

  // Split source list
  For I := 0 To ListBox1.Items.Count-1 Do
    Begin
      D := StrToInt(ListBox1.Items[i]);
      If D > 0 
        Then Begin SetLength(P,Length(P)+1); P[High(P)] := D; End
        Else Begin SetLength(N,Length(N)+1); N[High(N)] := D; End;
    End;

  // Check lengths
  If Length(P) <> Length(N) Then
    Raise Exception.Create('ERROR!!!');

  // Sort - if needed
  ...

  // Build new list
  ListBox1.Items.Clear;
  For I := Low(P) To High(P) Do
    Begin
      ListBox1.Items.Add(IntToStr(P[i]));
      ListBox1.Items.Add(IntToStr(N[i]));
    End;
end;
Ответить с цитированием