Doppelte Einträge aus NSMutableArray löschen

  • Doppelte Einträge aus NSMutableArray löschen

    Hallo,

    ich habe ein Array mit verschiedenen Werten, die aber leider öfter als einmal vorkommen.
    Wie lösche ich doppelte Werte am einfachsten, sodass jeder Wert nur noch einmal vorhanden ist?

    Viele Grüße,
    Philipp
  • Wenn die Reihenfolge egal ist, kannst Du eine Umwandlung in NSSet machen und danach alle Objekte wieder in einen NSMutableArray packen. Wenn die Reihenfolge wichtig ist, google mal nach "remove duplicates nsmutablearray", da gibt es haufenweise Beispielcode.
  • wie bereits gesat wenn die sortierung egal ist dann über NSSet und dann wieder in ein NSArray zurück.

    wenn die reihenfolge wichtig ist kannst du auch ein NSMutableSet und neues MutableArray anlegen, dein array mit fastenumeration durchlaufen, das set fragen ob es das aktuelle objekt enthällt, falls nicht dann ins set und ins neue array einfügen.
  • Wenn die Reihenfolge keine Rolle spielt und du keine doppelten Elemente haben willst, wieso verwendest du überhaupt ein Array? Verwende gleich ein Set.
    Wenn die Reihenfolge eine Rolle spielt und du keine doppelten Elemente haben willst, wieso verwendest du überhaupt ein Array? Verwende gleich ein Ordered-Set.

    Womit auch die Lösung klar ist, wie man die doppelten Lottchen wegwirft, ohne gleich die Reihenfolge auch wegzuwerfen.
    [NSOrderedSet orderedSetWithArray:array]
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • gritsch schrieb:

    wie bereits gesat wenn die sortierung egal ist dann über NSSet und dann wieder in ein NSArray zurück.

    wenn die reihenfolge wichtig ist kannst du auch ein NSMutableSet und neues MutableArray anlegen, dein array mit fastenumeration durchlaufen, das set fragen ob es das aktuelle objekt enthällt, falls nicht dann ins set und ins neue array einfügen.

    Alternativ kann man sich auch gleich erschießen.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Amin Negm-Awad schrieb:

    Wenn die Reihenfolge keine Rolle spielt und du keine doppelten Elemente haben willst, wieso verwendest du überhaupt ein Array? Verwende gleich ein Set.
    Wenn die Reihenfolge eine Rolle spielt und du keine doppelten Elemente haben willst, wieso verwendest du überhaupt ein Array? Verwende gleich ein Ordered-Set.

    Womit auch die Lösung klar ist, wie man die doppelten Lottchen wegwirft, ohne gleich die Reihenfolge auch wegzuwerfen.
    [NSOrderedSet orderedSetWithArray:array]


    NSOrderedSet kam erst mit 10.7
  • Amin Negm-Awad schrieb:

    gritsch schrieb:

    wie bereits gesat wenn die sortierung egal ist dann über NSSet und dann wieder in ein NSArray zurück.

    wenn die reihenfolge wichtig ist kannst du auch ein NSMutableSet und neues MutableArray anlegen, dein array mit fastenumeration durchlaufen, das set fragen ob es das aktuelle objekt enthällt, falls nicht dann ins set und ins neue array einfügen.

    Alternativ kann man sich auch gleich erschießen.


    erschieß lieber dich selbst anstelle solche aussagen zu veröffentlichen!
  • gritsch schrieb:

    Amin Negm-Awad schrieb:

    Wenn die Reihenfolge keine Rolle spielt und du keine doppelten Elemente haben willst, wieso verwendest du überhaupt ein Array? Verwende gleich ein Set.
    Wenn die Reihenfolge eine Rolle spielt und du keine doppelten Elemente haben willst, wieso verwendest du überhaupt ein Array? Verwende gleich ein Ordered-Set.

    Womit auch die Lösung klar ist, wie man die doppelten Lottchen wegwirft, ohne gleich die Reihenfolge auch wegzuwerfen.
    [NSOrderedSet orderedSetWithArray:array]


    NSOrderedSet kam erst mit 10.7

    Na, dann solltest du es aber so langsam mal kennen.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Amin Negm-Awad schrieb:

    gritsch schrieb:

    Amin Negm-Awad schrieb:

    Wenn die Reihenfolge keine Rolle spielt und du keine doppelten Elemente haben willst, wieso verwendest du überhaupt ein Array? Verwende gleich ein Set.
    Wenn die Reihenfolge eine Rolle spielt und du keine doppelten Elemente haben willst, wieso verwendest du überhaupt ein Array? Verwende gleich ein Ordered-Set.

    Womit auch die Lösung klar ist, wie man die doppelten Lottchen wegwirft, ohne gleich die Reihenfolge auch wegzuwerfen.
    [NSOrderedSet orderedSetWithArray:array]


    NSOrderedSet kam erst mit 10.7

    Na, dann solltest du es aber so langsam mal kennen.


    was nützt mir dass ich es kenne aber nicht verwenden kann :)
  • macmoonshine schrieb:

    Das ist doch wesentlich umständlicher und dauert länger als die Lösung von Markus und lucia. Außerdem reicht dafür eine Schleife nicht aus.

    Ich glaube schon, oder? Man kann doch einfach darüber iterieren und sich das letzte Element merken. Sind die beiden gleich, löscht man das Item. Sollte eigentlich gehen.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • gritsch schrieb:

    Amin Negm-Awad schrieb:

    gritsch schrieb:

    Amin Negm-Awad schrieb:

    Wenn die Reihenfolge keine Rolle spielt und du keine doppelten Elemente haben willst, wieso verwendest du überhaupt ein Array? Verwende gleich ein Set.
    Wenn die Reihenfolge eine Rolle spielt und du keine doppelten Elemente haben willst, wieso verwendest du überhaupt ein Array? Verwende gleich ein Ordered-Set.

    Womit auch die Lösung klar ist, wie man die doppelten Lottchen wegwirft, ohne gleich die Reihenfolge auch wegzuwerfen.
    [NSOrderedSet orderedSetWithArray:array]


    NSOrderedSet kam erst mit 10.7

    Na, dann solltest du es aber so langsam mal kennen.


    was nützt mir dass ich es kenne aber nicht verwenden kann :)

    Woher weißt du, dass er es nicht verwenden kann? Ich konnte deiner Anmerkung
    "wie bereits gesat wenn die sortierung egal ist dann über NSSet und dann wieder in ein NSArray zurück.

    wenn die reihenfolge wichtig ist kannst du auch ein NSMutableSet und neues MutableArray anlegen, dein array mit fastenumeration durchlaufen, das set fragen ob es das aktuelle objekt enthällt, falls nicht dann ins set und ins neue array einfügen."
    eigentlich nur deine Unkenntnis entnehmen, sonst nichts.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Amin Negm-Awad schrieb:

    macmoonshine schrieb:

    Das ist doch wesentlich umständlicher und dauert länger als die Lösung von Markus und lucia. Außerdem reicht dafür eine Schleife nicht aus.

    Ich glaube schon, oder? Man kann doch einfach darüber iterieren und sich das letzte Element merken. Sind die beiden gleich, löscht man das Item. Sollte eigentlich gehen.


    wenn du davon ausgehst dass sie nach ihrer gleichheit sortiert sind!? und in einer fastiteration löschen?
  • Amin Negm-Awad schrieb:

    gritsch schrieb:

    Amin Negm-Awad schrieb:

    gritsch schrieb:

    Amin Negm-Awad schrieb:

    Wenn die Reihenfolge keine Rolle spielt und du keine doppelten Elemente haben willst, wieso verwendest du überhaupt ein Array? Verwende gleich ein Set.
    Wenn die Reihenfolge eine Rolle spielt und du keine doppelten Elemente haben willst, wieso verwendest du überhaupt ein Array? Verwende gleich ein Ordered-Set.

    Womit auch die Lösung klar ist, wie man die doppelten Lottchen wegwirft, ohne gleich die Reihenfolge auch wegzuwerfen.
    [NSOrderedSet orderedSetWithArray:array]


    NSOrderedSet kam erst mit 10.7

    Na, dann solltest du es aber so langsam mal kennen.


    was nützt mir dass ich es kenne aber nicht verwenden kann :)

    Woher weißt du, dass er es nicht verwenden kann? Ich konnte deiner Anmerkung
    "wie bereits gesat wenn die sortierung egal ist dann über NSSet und dann wieder in ein NSArray zurück.

    wenn die reihenfolge wichtig ist kannst du auch ein NSMutableSet und neues MutableArray anlegen, dein array mit fastenumeration durchlaufen, das set fragen ob es das aktuelle objekt enthällt, falls nicht dann ins set und ins neue array einfügen."
    eigentlich nur deine Unkenntnis entnehmen, sonst nichts.


    es ist die antwort auf seine frage. wenn er eine andere datenklasse verwenden kann, dann kannst du das ja anmerken aber was an meiner aussage falsch ist solltest du mir jetzt auch erläutern!

    edit: warum ich davon ausgehe dass ers nicht verwenden kann? gut ein drittel der systeme im umlauf haben 10.6 drauf - sag mir also den grund warum ich davon ausgehen sollte dass man nur 2/3 der potenziellen kunden bedinen sollte?
  • 1. Wie komme ich bloß auf diese Annahme?
    "Du kannst auch was schöner wäre das Array Sortieren lassen und wenn er doppelte findet löscht du."

    2.1. Man kann in einem Array löschen, welches man gerade iteriert. Die dazugehörige Methode heißt -removeObjectAtIndex: (NSMutableArray). Man darf es bloß nicht bei Iteration mit Fast-Enumeration.
    2.2. Wie man bei Verwendung von Fast-Iteration in einem Array löscht, sollte dir mittlerweile bekannt sein. Immerhin gibt es die Fast-Enumeration schon seit 10.5.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Amin Negm-Awad schrieb:

    1. Wie komme ich bloß auf diese Annahme?
    "Du kannst auch was schöner wäre das Array Sortieren lassen und wenn er doppelte findet löscht du."

    2.1. Man kann in einem Array löschen, welches man gerade iteriert. Die dazugehörige Methode heißt -removeObjectAtIndex: (NSMutableArray). Man darf es bloß nicht bei Iteration mit Fast-Enumeration.
    2.2. Wie man bei Verwendung von Fast-Iteration in einem Array löscht, sollte dir mittlerweile bekannt sein. Immerhin gibt es die Fast-Enumeration schon seit 10.5.


    der satz mit der sortierung ist nicht von mir - lerne lesen!

    warum sollte man nicht fast-enumerieren? warum willst du 2 schleifen verwenden und dort dann jeweils mit objectAtIndex an die objekte ran? da ist die von mir genannte lösung viel efektiver (weiß ich aus eigener erfahrung). das set dient zur optimierung weil dieses viel schneller beantworten kann ob ein objekt enthalten ist als ein array. das array ist dazu da die einzigartigen objekte dann aufzunehmen (um das löschen zu verhindern)
  • gritsch schrieb:

    Amin Negm-Awad schrieb:

    gritsch schrieb:

    Amin Negm-Awad schrieb:

    gritsch schrieb:

    Amin Negm-Awad schrieb:

    Wenn die Reihenfolge keine Rolle spielt und du keine doppelten Elemente haben willst, wieso verwendest du überhaupt ein Array? Verwende gleich ein Set.
    Wenn die Reihenfolge eine Rolle spielt und du keine doppelten Elemente haben willst, wieso verwendest du überhaupt ein Array? Verwende gleich ein Ordered-Set.

    Womit auch die Lösung klar ist, wie man die doppelten Lottchen wegwirft, ohne gleich die Reihenfolge auch wegzuwerfen.
    [NSOrderedSet orderedSetWithArray:array]


    NSOrderedSet kam erst mit 10.7

    Na, dann solltest du es aber so langsam mal kennen.


    was nützt mir dass ich es kenne aber nicht verwenden kann :)

    Woher weißt du, dass er es nicht verwenden kann? Ich konnte deiner Anmerkung
    "wie bereits gesat wenn die sortierung egal ist dann über NSSet und dann wieder in ein NSArray zurück.

    wenn die reihenfolge wichtig ist kannst du auch ein NSMutableSet und neues MutableArray anlegen, dein array mit fastenumeration durchlaufen, das set fragen ob es das aktuelle objekt enthällt, falls nicht dann ins set und ins neue array einfügen."
    eigentlich nur deine Unkenntnis entnehmen, sonst nichts.


    es ist die antwort auf seine frage. wenn er eine andere datenklasse verwenden kann, dann kannst du das ja anmerken aber was an meiner aussage falsch ist solltest du mir jetzt auch erläutern!

    edit: warum ich davon ausgehe dass ers nicht verwenden kann? gut ein drittel der systeme im umlauf haben 10.6 drauf - sag mir also den grund warum ich davon ausgehen sollte dass man nur 2/3 der potenziellen kunden bedinen sollte?

    Die Antwort ist nicht falsch. Dann hätte ich geschrieben: "Das ist falsch." Ich habe aber geschrieben: "Alternativ kann sich auch gleich erschießen."
    Wieso sollte er langsameren und aufwändigen Code verwenden, wenn es das Built-In gibt? Und wieso sagst du nicht, dass es dir auf 10.6-Kompatibilität ankommt?
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?