2016-04-04 13 views
0

Zum Beispiel, wenn wir eine Instanz von NSMutableArray mit 10 Objekten darin haben. Wenn wir darüber iterieren, haben wir gefunden, dass wir das Objekt a [2] und a [8] löschen müssen und dann 3 Objekte bei [2] und 4 Objekte bei [8] kontinuierlich einfügen müssen, wie das bei der niedrigsten Zeit geht Kosten?Wenn Sie ein NSMutableArray iterieren, wie Sie ein Objekt löschen, fügen Sie dann mehrere Objekte ein?

Jede Idee wird dankbar sein!

+0

Verwenden Sie Swift oder Objective-C? Nur um zu wissen, wie man antwortet;) –

+0

Ich benutze objc, danke – longbow

+0

Ok, also ich in diesem Fall sollten Sie sich http://StackOverflow.com/Questions/25238436/ISit-Possible-To-Delete-Dictionary -from-mutablearray-while-iterating/25238661 # 25238661, das ist fast alles, was Sie brauchen :) –

Antwort

3

Edit: Wie @trojanfoe hingewiesen heraus, es ist schön hinzuzufügen, dass Sie niemals ein Array bearbeiten sollten, während Sie es iterieren. Dies gilt für viele Auflistungsklassen in vielen verschiedenen Sprachen. nicht nur NSMutableArray & Objective-C. Dies kann leicht zu einem Out-of-Bound-Index führen.


Für Ihre Frage, machen wir es in zwei Iterationen. Zuerst möchten wir die Indizes, die wir löschen möchten, speichern, so dass wir auf dem sourceArray iterieren werden.

NSMutableArray * indexesToRemove = [NSMutableArray array]; 

[sourceArray enumerateObjectsUsingBlock:^(NSNumber * obj, NSUInteger idx, BOOL * _Nonnull stop) { 
    if (obj.integerValue%2 == 1) { 
     // Insert at first position 
     [indexesToRemove insertObject:@(idx) atIndex:0]; 
    } 
}]; 

Es ist wichtig, den Index in einem Array und nicht in einem Satz zu speichern, da Sie Objekte später einfügen möchten. Außerdem ist es wichtig, die neuen Elemente am Anfang des Arrays hinzuzufügen, damit Sie vom größten Index zum kleinsten iterieren und die Indizes nicht entsprechend den zuvor hinzugefügten Elementen verschieben müssen.

Jetzt können Sie in einer neuen Iteration (diesmal auf dem Index-Array), die Elemente löschen und die neue hinzufügen die Indizes entsprechend Ihnen gespeichert:

[indexesToRemove enumerateObjectsUsingBlock:^(NSNumber * obj, NSUInteger idx, BOOL * _Nonnull stop) { 

    NSUInteger indexToRemove = obj.unsignedIntegerValue; 

    // Delete the item from the source array 
    [sourceArray removeObjectAtIndex:indexToRemove]; 

    // Create the items you want to insert, do whatever you want in this method :] 
    NSArray * itemsToAdd = [self generateElementsToAddAtIndex:indexToRemove]; 

    // Create the indexSet according to the start index and the number of objects you want to insert 
    NSIndexSet * indexSet = [NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(indexToRemove, itemsToAdd.count)]; 

    // Insert the objects 
    [sourceArray insertObjects:itemsToAdd atIndexes:indexSet];   
}]; 
+0

Danke, ich glaube, ich habe etwas gelernt:) – longbow

0

[myMutableArray replaceObjectAtIndex:2 withObject:"5"]; wird es funktionieren?

+0

Dies wird nur ersetzen, dh 1 Objekt für 1.OP fragt nach mehreren Objekten für 1, ich denke, –

+0

Ja, ich frage nach einem Objekt mit mehreren Objekten zu ersetzen – longbow

0

Zuerst müssen Sie Objekt löschen dann unter Codezeile verwenden, um mehrere Objekte einfügen:

NSMutableOrderedSet *orderedSet = [[NSMutableOrderedSet alloc] init]; 
[orderedSet insertObjects:@[@"Eezy", @"Tutorials"] atIndexes: 
         [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 2)]]; 
NSLog(@"Result: %@", orderedSet); 

unter dem Referenz Link Siehe:

http://ios.eezytutorials.com/nsmutableorderedset-by-example.php#.VwIJIhN95fg

0

Für ein so kleines Array und so viele Operationen, ich denke, das Array mit einem neuen zu ersetzen, eine gute Option - für Leistung sowie Klarheit.

+0

Vielen Dank für den Kommentar mit Kommentaren. – Eiko

+1

Ich habe nicht abgestimmt, aber ich habe Ihre Antwort aufgewertet, um diesen Downvote auszugleichen, weil ich denke, dass Ihre Meinung wertvoll ist:) – longbow

Verwandte Themen