2012-02-09 2 views
2

Я пытаюсь разделить содержимое StringList на несколько частей (в Delphi) ...
Звучит просто, но я тупо заблокирован: оКак разбить один StringList на два строковых списка в Delphi?

Например, StringList содержит 1001 строк, и я хотел бы Разделите содержимое на 2 StringLists. Таким образом, у каждого будет 500 строк, а у другого будет 501 строка.
Независимо от того, имеют ли первые 501 и вторую 500, или наоборот.

Если кто-то может подтолкнуть меня по правильному пути ...
Заранее благодарим!

Beny

ответ

5

Вы могли бы сделать что-то вроде этого:

for I := SL1.Count - 1 downto (SL1.Count div 2) do 
begin 
    SL2.Insert(0, SL1[I]); 
    SL1.Delete(I); 
end; 
+0

+1. Сначала я написал это, но он требует, чтобы все строки, помещенные во второй строковый список, менялись каждый раз, когда вы вставляете. Я изменил свое, чтобы не требовать, чтобы с помощью двух отдельных петель. В зависимости от размера исходного строкового списка они, вероятно, имеют одинаковую производительность - в больших списках я считаю, что мой немного быстрее, так как он не должен перераспределять и перемещать каждый раз, но имеет только распределение. :) –

+0

Большое спасибо! Я попробую скоро :) – Beny

+0

Просто отлично! Теперь я попробую разделить на 3 части. – Beny

3

Вы можете сделать это вручную довольно легко:

var 
    i: Integer; 
    MidIndex, HighIndex: Integer; 
begin 
    MidIndex := SLOne.Count div 2; // Center of first list's items 
    HighIndex := SLOne.Count - 1; // End of first list 

    // Copy from center to end of first list, keeping order 
    // of items intact 
    for i := MidIndex to HighIndex do 
    SLTwo.Append(SLOne[i]); 

    // Go back and remove the ones you just put into the second 
    // list. Go backward to prevent going past the end. 
    for i := HighIndex downto MidIndex do 
    SLOne.Delete(i); 
end; 
+0

Благодарим за помощь :) – Beny

+0

+1 Это O (N), а не O (N^2) Кобика. Один незначительный каламбур. заключается в том, что код будет более читабельным с некоторыми пояснительными локальными варами для границ цикла. И это также должно было бы уточнить, что две петли охватывали одинаковые диапазоны. –

+1

@David, хороший пункт. Это сделает его более ясным. Готово. –

Смежные вопросы