2012-02-09 3 views
2

내가 (델파이에서) 여러 부분으로 StringList 컨텐츠를 분할하기 위해 노력하고있어 ...
쉽게 소리 그러나 나는 바보 차단 해요 :하나의 StringList를 Delphi에서 두 개의 문자열 목록으로 분할하는 방법은 무엇입니까?

는 예를 들어, StringList 1001 선을 포함하고 내가 싶습니다 O를 내용을 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

일을. 먼저이 코드를 작성했지만 삽입 할 때마다 두 번째 문자열 목록에 입력 된 모든 문자열을 이동해야합니다. 나는 두 개의 분리 된 루프를 사용하여이를 필요로하지 않도록 광산을 변경했다. 원래의 문자열 목록의 크기에 따라, 그들은 아마 같은 성능에 관한 것입니다 - 큰 목록에서, 제 생각에는 약간 더 빠릅니다. 매번 재 할당하고 이동할 필요가 없기 때문에 할당이 있습니다. :) –

+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 이것은 Kobik의 O (N^2)보다는 O (N)입니다. 사소한 일이다. 코드가 루프 바운드에 대한 설명이 가능한 로컬 변수로 더 읽기 쉽다는 것입니다. 그리고 그것은 또한 두 개의 고리가 같은 범위를 커버했다는 것을 분명히 할 것입니다. –

+1

@ David, 좋은 지적. 그렇게되면 더 명확 해집니다. 끝난. –

관련 문제