2016-11-16 12 views
5

Tôi có một loạt tệp có đường dẫn tệp và tên tệp khác nhau, tất cả tên tệp có cùng đuôi nhưng tên thư mục hoặc đường dẫn khác nhau và đã đặt về tải tệp vào Tstringlist và tôi đang cố gắng sắp xếp chúng thành thứ tự tên tập tin mặc dù chúng cũng có đường dẫn.Delphi XE2 Sắp xếp Tstringlist theo Tên tệp

Dưới đây là một ví dụ về chuỗi trong TStringList: -

c:\directory 1\AboutUs.lnk 
c:\directory something\AAHelp.lnk 
c:\directory anything\AAATalk.lnk 

Khi sắp xếp theo phần tên tập tin của chuỗi Tôi muốn kết thúc với.

c:\directory anything\AAATalk.lnk 
c:\directory something\AAHelp.lnk 
c:\directory 1\AboutUs.lnk 

Nói cách khác, tôi muốn có thể sắp xếp các chuỗi có đường dẫn theo phần tên tệp của chuỗi.

Mọi trợ giúp sẽ được đánh giá cao !.

Trả lời

6

Sử dụng TStringList.CustomSort():

function Compare(List: TStringList; Index1, Index2: Integer): Integer; 
begin 
    Result := CompareStr(
    LowerCase(ExtractFileName(List[Index1])), 
    LowerCase(ExtractFileName(List[Index2])) 
); 
end; 

// Then, just call: 
YourStrList.CustomSort(Compare); 
+1

Cách tiếp cận này sẽ làm việc nhưng nó có thể có hiệu suất khá nghèo. Tại sao? Bởi vì trong phương pháp này bạn đang gọi 'ExtractFileName' hai lần cho mỗi so sánh. Bây giờ có bao nhiêu so sánh là cần thiết phần lớn phụ thuộc vào thuật toán phân loại được sử dụng. Vì vậy, tôi sẽ khuyên bạn nên chuẩn bị dữ liệu (trích xuất tên tệp) trước khi thực hiện bất kỳ sắp xếp nào. Điều này có thể đẩy nhanh quá trình đáng kể vì bạn chỉ cần gọi 'ExtractFileName' một lần cho mỗi mục danh sách. – SilverWarior

+1

Hoặc có lẽ cách tiếp cận tốt hơn nữa là chuẩn bị dữ liệu của bạn để nó được lưu trữ dưới dạng cặp chuỗi trong đó một chuỗi đại diện cho đường dẫn tệp và một chuỗi khác đại diện cho tên tệp. Điều này cũng sẽ cho phép bạn thực hiện phân loại 'multi-parameter' nơi ban đầu bạn sắp xếp dữ liệu của mình dựa trên tên tệp và khi bạn có nhiều tệp có cùng tên bạn sẽ sắp xếp chúng theo đường dẫn của chúng. – SilverWarior

+0

@SilverWarior, tôi hiểu ý kiến ​​của bạn về tối ưu hóa. Bạn có thể đăng câu trả lời triển khai ý tưởng của mình và tôi rất sẵn lòng đề xuất thay đổi câu trả lời được chấp nhận. – karliwson

Các vấn đề liên quan