2010-10-02 15 views
5

Załóżmy, że mam nieposortowaną listę czterech obiektów: [B, C, A, D]. Wszystkie cztery przedmioty są tego samego typu, przy czym:
(A> B)
(C> D)

(B = C lub D!)
(A = C lub D!) (C! = A lub B)
(D! = A lub B).
Przez "! =" Mam na myśli to, że nie są one ani mniejsze, ani równe, ani większe od innych obiektów.Algorytm do porównywania luźno porównywalnych danych?

Muszę "sortować" listę tak, że A zawsze będzie przed B, a C zawsze będzie przed D. Poza tymi dwoma wymogami, nie mam żadnego żądania w sprawie uporządkowania listy; dlatego, biorąc pod uwagę poprzednio opisaną listę, funkcja sortowania powinna zwrócić wartość [A, B, C, D] lub [C, D, A, B].

Co do przyczyny tego problemu, próbuję posortować tablicę obiektów java.lang.Class na podstawie ich wzajemnych relacji. Na przykład, jeśli A jest super-klasą/super-interfejsem B, to A jest mniejsze niż B. Jeśli A rozszerza/implementuje B, to A jest większe niż B. Jeśli A jest B, to oczywiście A jest równe B . w przeciwnym razie, jest zupełnie nieporównywalne do B.

Dzięki z góry,
~ Mack

+5

Nazywa się to "sortowaniem topologicznym". Musisz ustalić relacje "większe niż", a stamtąd możesz obliczyć wartość "rangi" dla każdego elementu za pomocą prostej funkcji rekursywnej: ranga elementu to ranga tego, co jest większe niż + 1, lub 1 Następnie możesz sortować normalnie według rangi. – Pointy

+0

Myślę, że trzeba wyjaśnić, dlaczego [A, C, B, D], [A, C, D, B], [C, A, D, B] i [C, A, B, D] nie są prawidłowe rozwiązanie. Czy po prostu chcesz zachować porównywalne obiekty razem. Następnie powinieneś zrobić coś, co określi "kolejność" tego: Porównywalność z nich powinna stać się przed ich porównywalnością. – ontrack

+0

Jakie jest pytanie? Dlaczego nie możesz zawsze wyprowadzać [A, B, C, D], jeśli wiesz, że to jest poprawne? – IVlad

Odpowiedz

5

Budowanie wykresu. Dla każdego z dwóch elementów x i y takich, że x > y, dodaj skierowaną krawędź od x do y. W twoim przykładzie masz A -> B i C -> D. Następnie uruchom topological sort na tym wykresie. Topologiczny sortowany powrót będzie możliwym rozwiązaniem.

Powiązane problemy