2009-01-14 41 views
17

Tôi đang tìm một thuật toán sắp xếp các chuỗi tương tự như cách tệp (và thư mục) được sắp xếp trong Windows Explorer. Dường như giá trị số trong chuỗi được tính đến khi sắp xếp mà kết quả trong một cái gì đó giống nhưPhương pháp sắp xếp Windows Explorer

name 1, name 2, name 10 

thay vì

name 1, name 10, name 2 

mà bạn nhận được với một so sánh chuỗi thông thường.

Tôi sắp bắt đầu viết bản thân mình nhưng muốn kiểm tra xem có ai đã làm điều này trước đây và sẵn sàng chia sẻ một số mã hoặc thông tin chi tiết. Cách tôi sẽ tiếp cận này sẽ là thêm số 0 đầu vào các giá trị số trong tên trước khi so sánh chúng. Điều này sẽ dẫn đến một cái gì đó như:

name 00001, name 00010, name 00002 

khi được sắp xếp theo kiểu chuỗi thông thường sẽ cho tôi kết quả chính xác.

Bất kỳ ý tưởng nào?

+1

http://stackoverflow.com/questions/248603/natural-sort-order-in-c-sharp –

Trả lời

14

Nó được gọi là "thứ tự sắp xếp tự nhiên". Jeff đã có một pretty extensive blog entry trên nó một thời gian trước đây, trong đó mô tả những khó khăn bạn có thể bỏ qua và có liên kết đến một số triển khai.

1

Cách tôi hiểu, Windows Explorer sắp xếp theo ví dụ thứ hai của bạn - nó luôn làm tôi bực bội khi thứ tự xuất hiện 1, 10, 2. Đó là lý do tại sao hầu hết các ứng dụng ghi nhiều tệp (như ứng dụng hàng loạt) sử dụng tên tập tin có độ dài cố định với số 0 đứng đầu hoặc bất kỳ thứ gì.

Giải pháp của bạn sẽ hoạt động, nhưng bạn cần phải cẩn thận khi các số nằm trong tên tệp và có thể chỉ sử dụng cách tiếp cận của bạn nếu chúng ở cuối.

6

Explorer sử dụng API StrCmpLogicalW() cho loại sắp xếp này (được gọi là 'thứ tự sắp xếp tự nhiên').

Bạn không cần phải viết hàm so sánh của riêng mình, chỉ cần sử dụng chức năng đã tồn tại.

Giải thích tốt có thể được tìm thấy here.

0

Đây là một cố gắng để thực hiện nó trong Java:

Java - Sort Strings like Windows Explorer

Nói tóm lại nó chia tách hai Strings để so sánh trong Thư - Linh kiện ô Digit và so sánh phần này một cách cụ thể để đạt được loại phân loại.

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