2010-10-02 74 views
5

Giả sử tôi có một danh sách chưa được phân loại gồm bốn đối tượng: [B, C, A, D]. Tất cả bốn đối tượng là cùng loại, và:
(A> B),
(C> D),

(B = C hoặc D!)
(A = C hoặc D!) (C! = A hoặc B)
(D! = A hoặc B).
Bởi "! =", Tôi có nghĩa là chúng không nhỏ hơn, bằng hoặc lớn hơn các đối tượng khác.Thuật toán để sắp xếp dữ liệu có thể so sánh lỏng lẻo?

Tôi cần "sắp xếp" danh sách sao cho A sẽ luôn đến trước B và C sẽ luôn đến trước D. Ngoài hai yêu cầu đó, tôi không có yêu cầu về thứ tự của danh sách; do đó, với danh sách được mô tả trước đây, hàm sắp xếp sẽ trả về [A, B, C, D] hoặc [C, D, A, B].

Vì nguyên nhân của vấn đề này, tôi đang cố sắp xếp một mảng các đối tượng java.lang.Class dựa trên mối quan hệ của chúng với nhau. Ví dụ, nếu A là siêu hạng/siêu giao diện của B, thì A nhỏ hơn B. Nếu A mở rộng/triển khai B, thì A lớn hơn B. Nếu A là B, thì rõ ràng A bằng B . Nếu không, A là hoàn toàn không thể so sánh với B.

Cảm ơn trước,
~ Mack

+5

Điều này được gọi là "loại topo". Bạn cần thiết lập các mối quan hệ "lớn hơn" và từ đó bạn có thể tính toán giá trị "xếp hạng" cho mọi phần tử với hàm đệ quy đơn giản: thứ hạng của phần tử là thứ hạng lớn hơn + 1 hoặc cách khác 1 Sau đó, bạn có thể sắp xếp bình thường trên bảng xếp hạng. – Pointy

+0

Tôi nghĩ bạn cần giải thích tại sao [A, C, B, D], [A, C, D, B], [C, A, D, B] và [C, A, B, D] không phải là một giải pháp hợp lệ. Hay bạn chỉ muốn giữ các vật thể so sánh với nhau. Sau đó, bạn nên làm một cái gì đó mà sẽ xác định "một" thứ tự của điều đó: Sự so sánh của những nên trở thành trước khi so sánh của những người. – ontrack

+0

Câu hỏi là gì? Tại sao bạn không thể luôn xuất [A, B, C, D] nếu bạn biết điều này là chính xác? – IVlad

Trả lời

5

Xây dựng một đồ thị. Đối với mỗi hai yếu tố xy sao cho x > y, hãy thêm cạnh được hướng từ x đến y. Trong ví dụ của bạn, bạn có A -> BC -> D. Sau đó chạy topological sort trên biểu đồ này. Phân loại tôpô được trả về sẽ là một giải pháp khả thi.

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