2016-08-08 36 views
0

Ich habe ein NSMutableArray (ArrayOne) wie so strukturiert ..Hinzufügen von Objekten zu NSMutableArray von einem anderen NSMutableArray (iOS)

({ 
    "item_image_timeStamp" = "492364855.234597"; 
    "item_image_url" = "sample url"; 
    "item_image_vote" = 123; 
}, { 
    "item_image_timeStamp" = "492364458.236597"; 
    "item_image_url" = "sample url"; 
    "item_image_vote" = 456; 
}, { 
    "item_image_timeStamp" = "492364179.052397"; 
    "item_image_url" = "sample url"; 
    "item_image_vote" = 6184; 
}, { 
    "item_image_timeStamp" = "492364789.004447"; 
    "item_image_url" = "sample url"; 
    "item_image_vote" = 64; 
}, { 
    "item_image_timeStamp" = "492364356.002341"; 
    "item_image_url" = "sample url"; 
    "item_image_vote" = 3778; 
}) 

Die maximale Anzahl von Objekten, die in ArrayOne enthalten sein können, 10.

ist dann habe ich eine zweite NSMutableArray (ArrayTwo) strukturiert wie ArrayOne

({ 
    "item_image_timeStamp" = "492364855.234597"; 
    "item_image_url" = "sample url"; 
    "item_image_vote" = 123; 
}, { 
    "item_image_timeStamp" = "492364458.236597"; 
    "item_image_url" = "sample url"; 
    "item_image_vote" = 456; 
}) 

..except dass die maximale Anzahl der Objekte, die con sein können tained in ArrayTwo ist 3.

Nun ist Was ich tun möchte, ..

  • Objekte von ArrayTwo in ArrayOne hinzufügen
  • (im Sinn nur zu halten, dass ArrayOne maximal 10 Objekte halten kann) die obersten 5 Objekte nach dem Schlüssel "item_image_vote" sortieren lassen (die obersten fünf gewählten Objekte sollten nicht ersetzt werden)
  • Wenn Objekte in ArrayOne ersetzt werden müssen, sollte zuerst das Element mit dem niedrigsten Wert für den Schlüssel "item_image_timeStamp" ersetzt werden. (Das älteste Objekt wird zuerst ersetzt ... gefolgt von dem zweitältesten).

Ich hoffe, ich habe meine Frage nicht zu verwirrend gemacht. Vielen Dank im Voraus.

+0

getan werden Was haben Sie versucht? Auch Ihr Algorithmus ist nicht ganz klar - soll das endgültige Array (a) die ursprünglichen Top 5 von First, (b) alle von Second und (c) den jüngsten Rest von Items in First enthalten, die passen? Oder wird der Algorithmus pro Eintrag in Sekunde ausgeführt, d. H. Das Hinzufügen der zweiten von der zweiten Ausgabe könnte die gerade hinzugefügte erste von der zweiten? – CRD

+0

Ja genau, was Sie gesagt haben. Das letzte Array soll enthalten: (a) die ursprünglichen Top 5 von First, (b) alle von Second, und (c) das jüngste aller verbleibenden Elemente in First, die in –

Antwort

0

Hinzufügen, Entfernen und Messen der Länge sind alle Methoden auf veränderlichen Arrays, die einfach anzuwenden sind. Der interessante Teil der Frage ist das Sortierkriterium, das von NSSortDescriptor sehr gut angesprochen wird.

NSArray ermöglicht die Anwendung von diesen in Gruppen mit sortedArrayUsingDescriptors (beachten Sie die Mehrzahl). Ein guter Ansatz besteht also darin, Arrays hinzuzufügen, nach Ihren Kriterien zu sortieren und auf eine maximale Länge zu kürzen.

// sort on vote, descending 
NSSortDescriptor *voteDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"item_image_vote" ascending:NO]; 

// sort on date, descending 
NSSortDescriptor *dateDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"item_image_timeStamp" ascending:NO]; 

NSMutableArray *bigArray = [ArrayOne mutableCopy]; // note: lowercase variable names is considered preferable style 
[bigArray addObjectsFromArray:ArrayTwo]; 

[bigArray sortUsingDescriptors:@[voteDescriptor, dateDescriptor]]; 
// note: order matters. you want votes sorted first, ties broken with date 

Das Ergebnis ist die bigArray, nun sortiert, abgeschnittene auf die maximale Größe.

NSArray *result = [bigArray subarrayWithRange:NSMakeRange(0, MIN(10, bigArray.count))]; 
+0

passen Sie entfernen das Älteste mit der niedrigsten Stimme, nicht das Älteste mit einer Nicht-Top-5-Stimme - was die Frage spezifiziert, denke ich. Allerdings ist der Algorithmus in der Frage nicht präzise und Sie könnten implementiert haben, was das OP wünscht, aber nicht richtig beschrieben ... – CRD

+0

Tut mir leid..das wird nicht funktionieren. Das letzte Array soll (a) das Original-Top enthalten 5 von Zuerst, (b) alle von Zweiter, und (c) der jüngste Rest bleibt in First, der passt –

0

Yes..exactly, was du letzten Array said..the sollte enthalten (a) die Original-Top-5-First, (b) all Zweitens, und (c) die jüngsten von jedem in erstem bleibt Gegenstände, die

Nur Arbeit durch Ihre Anforderung in Schritten passen:

  1. Wenn die Anzahl der Elemente im ersten & Zweiter kombiniert ist < = 10 tritt einfach bei.

  2. "die ursprünglichen Top 5 von First" - Sortiere zuerst nach Vote Count, können Sie eine Funktion, Block oder Deskriptor basierte Sortierung verwenden. Kopieren Sie die ersten 5 (es müssen mindestens 5 aufgrund von [1] sein, damit hier keine Überprüfung erforderlich ist) als Ergebnis.

  3. "alle von Second" - Fügen Sie die Elemente von Second zu Ihrem Ergebnis hinzu. Sie haben jetzt 6-8 Artikel in Ihrem Ergebnis.

  4. Kopieren Sie die Artikel ab 6 Ihrer ersten Sortierung aus [2] und sortieren Sie das resultierende Array nach Alter. Fügen Sie die ersten 2-4 Elemente nach Bedarf zu Ihrem Ergebnis hinzu.

Alle oben kann mit handelsüblichen NSArray Verfahren zum Sortieren, Kopieren und Anhängen,

HTH

Verwandte Themen