2012-09-05 3 views
2

Delphi XE2에서 문자열 목록을 정렬하는 데 문제가 있습니다. 때문에 TStringList.Sorted가 true (도 직접도 SetSorted 사용)로 설정되지 않습니다 있다는 사실에Delphi XE2에서 문자열 목록을 정렬 된 것으로 표시하지 않습니다.

procedure AddText(); 
var 
    StrList: TStringList; 
begin 
    StrList := TStringList.Create(); 
    StrList.Add('Test1'); 
    StrList.Sort(); 
    WriteLn('Sorted: ' + BoolToStr(StrList.Sorted, true)); // Prints "Sorted: false" 
    StrList.Add('Test2'); 
    StrList.Sort(); 
    WriteLn('Sorted: ' + BoolToStr(StrList.Sorted, true)); // Prints "Sorted: false" 
    StrList.Add('Test3'); 
    StrList.Free(); 
end; 

문제, 지금까지의 내가 이해,이다 예를 들면 다음과 같습니다이다. 나만인가, 아니면 벌레 일까?

+3

는'Sorted' 결코 목록의 ** ** 미리 상태에 대해 알려줍니다 . 'Sorted'는리스트가 어떻게 동작 하는지를 제어하는 ​​** 속성입니다. 거짓이면 목록에 추가하고 마지막에 새 항목이 추가됩니다. 'Sorted'가 true 일 때, 새로운 아이템은 항상 순서대로 삽입됩니다. 즉, 목록에 'b', 'c'및 'd'가 있고 'a'를 추가하면 목록의 머리에 추가됩니다. –

+0

그들은'AutoSortNewItems' (; –

답변

6

Classes 단위에 TStringList.Sort에 대해 아무 것도 없으므로 속성을 변경해야합니다. TStringList.Sort 메서드는 기본 정렬 함수로 CustomSort을 호출하기 만하면됩니다. 목록의 상태를 나타내는 (정렬되거나 정렬되지 않음) 지표는 아닙니다. 단순히 목록이 내부 정렬 알고리즘을 사용하여 정렬되고 새 항목이 끝 대신 올바른 위치에 추가되는지 여부를 결정합니다. documentation :

목록의 문자열을 자동으로 정렬할지 여부를 지정합니다.

Sorted를 true로 설정하면 목록의 문자열이 오름차순으로 자동 정렬됩니다. 문자열을 삽입 할 위치에 남겨 두려면 false로 정렬을 설정하십시오. Sorted가 false 인 경우 Sort 메서드를 호출하여 목록의 문자열을 언제든지 오름차순으로 배치 할 수 있습니다.

Sorted가 true 인 경우 삽입을 사용하여 목록에 문자열을 추가하지 마십시오. 대신 Add를 사용하여 새 문자열을 적절한 위치에 삽입합니다. Sorted가 false이면 Insert를 사용하여 목록의 임의의 위치에 문자열을 추가하거나 Add를 사용하여 목록의 끝에 문자열을 추가합니다.

처음에는 잘못 사용했습니다. 간단히 문자열을 모두 StringList에 추가 한 다음 Sorted := True;으로 설정하면됩니다. 속성 값을 올바르게 설정하고 내부 Sort 메서드를 자동으로 호출합니다.

procedure AddText(); 
var 
    StrList: TStringList; 
begin 
    StrList := TStringList.Create(); 
    StrList.Add('Test1'); 
    StrList.Add('Test2'); 
    StrList.Add('Test3'); 
    StrList.Sorted := True; 
    // Do whatever 
    StrList.Free; 
end; 

(당신은 특히 모든 단일 항목이 추가 된 후 Sort()를 호출하고 싶지 않은, 즉 매우 느리고 비효율적입니다.)

+0

+1)이라고 불러야 만합니다. 또 다른 옵션은 문자열을 추가하기 전에'.Sorted : = True' *를 설정하는 것입니다. 새 문자열을 추가하면 올바른 순서 위치에 삽입됩니다. 나는 이것이 더 빠르다고 믿는다. (Add 메서드는'Find'를 사용하고 그 인덱스 다음에 새로운 문자열을 추가 할 것이기 때문에) – kobik

+0

@kobik, 실제로 느리다. 왜냐하면'Find'를 사용해야하고 모든 문자열 뒤에 삽입을해야하기 때문이다. 'Sorted : = False'를 설정하고 모든 문자열을 추가 한 다음 Sorted를 true로 설정하면 정렬은 한 번만 수행되고 찾거나 삽입하지 않습니다 –

+1

비교에서 여전히 O (n log n)입니다. Quicksort와 같음 목록이 이미 정렬되어 있지 않은 경우! 그러나 기존 값을 위로 이동해야하는 삽입에 대한 벌금을 지불합니다. –

관련 문제