Gleiche Objekte eines Array zu einem neuen hinzufügen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Gleiche Objekte eines Array zu einem neuen hinzufügen

    Hi,

    angenommen ich habe 5 Arrays.
    Array1 = [@"1",@"2",@"3",@"4",@"5", nil];
    Array2 = [@"2",@"3",@"4",@"5",@"6", nil];
    Array3 = [@"3",@"4",@"5",@"6",@"7", nil];
    Array4 = [@"4",@"5",@"6",@"7",@"8", nil];
    Array5 = [@"5",@"6",@"7",@"8",@"9", nil];

    Daraus möchte ich jetzt die Elemente die JEDES Array hat in einem neuen Array mergen.

    Also:

    mergedArray = [@"5", nil];

    Wie kann ich das realisieren ohne 5 for Schleifen?
    Danke für eure Hilfe
  • macmoonshine schrieb:

    Warum legst Du nicht alle Arrays in ein Array? Dann brauchst Du mit containsObject: nur zwei explizite Schleifen. Mit NSMutableSet und intersectSet: geht es sogar mit einer expliziten Schleife bzw. fünf ähnlichen Anweisungen. ;)

    BTW: Das nil am Ende der Arrays ist überflüssig, wenn nicht sogar falsch.


    Ich hab das nur als Beispiel angeben wie man es bei Objective macht beim initialsisieren

    Quellcode

    1. ​ NSMutableArray *array = [[NSArray array] initWithObjects:(id), ..., nil];


    Vielen dank für die Vorschläge ich versuch das nachher mal :)

  • macmoonshine schrieb:

    Warum legst Du nicht alle Arrays in ein Array? Dann brauchst Du mit containsObject: nur zwei explizite Schleifen. Mit NSMutableSet und intersectSet: geht es sogar mit einer expliziten Schleife bzw. fünf ähnlichen Anweisungen. ;)

    BTW: Das nil am Ende der Arrays ist überflüssig, wenn nicht sogar falsch.


    Du sagst man braucht nur 2 explizierte Schleifen wenn ich contains Object verwende.

    Wenn ich alle 5 Arrays in ein Array packe. Wie schaff ich das dann zu überprüfen ob ein Element in allen enthalten.

    Hier mein Code

    Quellcode

    1. for (NSArray *array in tmpArray) {
    2. for (Recipe *recipe in array) {
    3. if (array....) {
    4. <#statements#>
    5. }
    6. }
    7. }
    Alles anzeigen
  • Ich hab jetzt das gemacht

    Quellcode

    1. -(NSArray*)getMergedArray{
    2. NSMutableArray *mergedArray = [NSMutableArray new];
    3. NSArray *overallArray = [[NSArray alloc] initWithObjects:self.packageRecepieArray, self.categoryRecipeArray, self.ingredientRecipeArray, self.caloriesRecipeArray, self.durationRecipeArray, nil];
    4. for (NSArray *specificArray in overallArray) {
    5. for (Recipe *recipe in specificArray) {
    6. int j = 0;
    7. for (int i = 0; i < [overallArray count]; i++) {
    8. NSArray *specificArrayTmp = [overallArray objectAtIndex:i];
    9. if ([specificArrayTmp containsObject:recipe]) {
    10. j++;
    11. }
    12. }
    13. if (j == 5) {
    14. if (![mergedArray containsObject:recipe]) {
    15. [mergedArray addObject:recipe];
    16. }
    17. }
    18. }
    19. }
    20. return mergedArray;
    21. }
    Alles anzeigen


    Habt ihr noch ne Optimierungsidee. Das war jetzt eher Quick and Dirty
  • Ungefähr so:

    Quellcode

    1. NSArray *overallArray = @[self.categoryRecipeArray, self.ingredientRecipeArray, self.caloriesRecipeArray, self.durationRecipeArray];
    2. NSMutableSet *theSet = [NSMutableSet setWithArray:self.packageRecepieArray];
    3. for(NSArray *theArray in overallArray) {
    4. [theSet intersectSet:[NSSet setWithArray:theArray]];
    5. }
    6. NSArray *theResult = [theSet allObjects];


    Nachtrag: Natürlich kannst Du, wie von gritsch bereits vorgeschlagen auch auf die Schleife verzichten und die Array-Elemente mit einzelnen Anweisungen hinzufügen. Generell ist es häufig jedoch günstig, viele gleichartige Variablen in einem gemeinsamen Container unterzubringen. Dann könnte man dieses Problem beispielsweise mit KVC in einer Zeile lösen. ;)
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    Ungefähr so:

    Quellcode

    1. ​NSArray *overallArray = @[self.categoryRecipeArray, self.ingredientRecipeArray, self.caloriesRecipeArray, self.durationRecipeArray];
    2. NSMutableSet *theSet = [NSMutableSet setWithArray:self.packageRecepieArray];
    3. for(NSArray *theArray in overallArray) {
    4. [theSet intersectSet:[NSSet setWithArray:theArray]];
    5. }
    6. NSArray *theResult = [theSet allObjects];


    bei 5 stück ist es aber gleich lang (von den zeilen), übersichtlicher und auch schneller wenn man anstatt dem array und der schleife einfach die 5 zeilen untereinander kloppt ;)