2011-12-31 8 views
5

Mam dwie NSMutableArrays. Zawartość pierwszy jest numerycznie, który jest powiązany z treścią drugiego:Zamów dwie NSMutableArrays na podstawie jednej

First Array Second Array 
    45    Test45 
    3    Test3 
    1    Test1 
    10    Test10 
    20    Test20 

To wygląd obu tablic. Teraz, jak mogę zamówić je tak numerycznie, więc kończą się tak:

First Array Second Array 
    1    Test1 
    3    Test3 
    10    Test10 
    20    Test20 
    45    Test45 

Dzięki!

+2

Jest to znane jako "sortowanie według indeksów". Co dziwne, nie ma rutyny bibliotecznej do robienia tego w Objective-C lub w większości innych środowisk, mimo że wymaganie pojawia się tutaj dość często. Najprostszym sposobem jest umieszczenie twoich wpisów w innym obiekcie (element First Array/Second Array) i posortowanie tych obiektów, a następnie zrekonstruowanie twoich tablic. W przeciwnym razie musiałbyś napisać własną procedurę sortowania. –

+0

Przykro mi, ale nie zrozumiałem tego :(Po raz pierwszy zajmuję się sortowaniem tablic, więc nie mam pojęcia :( – pmerino

Odpowiedz

17

Umieściłbym dwie tablice w słowniku jako klucze i wartości. Następnie możesz posortować pierwszą tablicę (działającą jak klucze w słowniku) i szybko uzyskać dostęp do wartości słownika w tej samej kolejności. Zauważ, że zadziała to tylko wtedy, gdy obiekty z pierwszej tablicy obsługują NSCopying, ponieważ tak działa NSDictionary.

Poniższy kod powinien to zrobić. Jest to dość krótki, ponieważ NSDictionary oferuje kilka fajnych metod wygody.

// Put the two arrays into a dictionary as keys and values 
NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:secondArray forKeys:firstArray]; 
// Sort the first array 
NSArray *sortedFirstArray = [[dictionary allKeys] sortedArrayUsingSelector:@selector(compare:)]; 
// Sort the second array based on the sorted first array 
NSArray *sortedSecondArray = [dictionary objectsForKeys:sortedFirstArray notFoundMarker:[NSNull null]]; 
+3

Bardzo ładny kod, ale nie obsługuje przypadku, gdy klucze nie są wyjątkowy. –

8

Zamiast przechowywać dwie równoległe tablice, zachowałbym pojedynczą tablicę obiektów modelu. Każda liczba z pierwszej tablicy będzie wartością jednej właściwości, a każdy ciąg z drugiej tablicy będzie wartością drugiej właściwości. Następnie można sortować na jedną lub obie właściwości za pomocą sort descriptors.

Zasadniczo w kakao i kakao Touch równoległe tablice umożliwiają pracę, podczas gdy obiekty modelu oszczędzają pracę. Wolaj tego drugiego od tego pierwszego, gdzie tylko możesz.