Array Extension filter function

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

  • Klar geht das.

    Du meinst sowas hier?

    C-Quellcode

    1. extension Array {
    2. mutating func filterAndGetRemainder(_ isIncluded: (Element) throws -> Bool) rethrows -> [Element] {
    3. var tmpSelf = Array<Element>()
    4. var remainder = Array<Element>()
    5. for e in self {
    6. if try isIncluded(e) {
    7. tmpSelf.append(e)
    8. }
    9. else {
    10. remainder.append(e)
    11. }
    12. }
    13. self = tmpSelf
    14. return remainder
    15. }
    16. }
    17. var array = Array(1..<10)
    18. let remainder = array.filterAndGetRemainder({ $0 % 2 == 0 })
    19. print(array) // [2, 4, 6, 8]
    20. print(remainder) // [1, 3, 5, 7, 9]
    Alles anzeigen
    NB: Quick & dirty auf die Schnelle zusammengeschustert...
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?
  • macmoonshine schrieb:

    Könnte man das nicht sogar über reduce und einem Array in einem Dreizeiler machen, indem die Filter-Closure die entfernten Element in das Array einfügt?
    Ich wüßte nicht, wie reduce da weiterhelfen könnte? Eher eine Mischung aus filter und map, allerdings kann man innerhalb der Closure das Original ja nicht mutieren. (?)

    Man kann natürlich auch 'einfach' zweimal den Filter ansetzen und dabei dann bloß die Filterlogik umkehren. ;)

    Quellcode

    1. var array = Array(1..<10)
    2. let filtered = array.filter({ $0 % 2 == 0 })
    3. let remainder = array.filter({ !($0 % 2 == 0) })
    4. array = filtered
    5. print(array) // [2, 4, 6, 8]
    6. print(remainder) // [1, 3, 5, 7, 9]
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von torquato ()

  • torquato schrieb:

    Ich wüßte nicht, wie reduce da weiterhelfen könnte?
    Stimmt ;)

    Ich meinte sowas, auch wenn es ein bisschen mehr als 3 Zeilen sind:

    Quellcode

    1. extension Array {
    2. mutating func filterAndGetRemainder(_ isIncluded: (Element) -> Bool) -> [Element] {
    3. var theRemainder = Array<Element>()
    4. self = self.filter({
    5. let isIncluded = isIncluded($0)
    6. if !isIncluded {
    7. theRemainder.append($0)
    8. }
    9. return isIncluded
    10. })
    11. return theRemainder
    12. }
    13. }
    Alles anzeigen
    Diese Version hat den Vorteil, dass sie die filter-Methode wiederverwendet.
    „Meine Komplikation hatte eine Komplikation.“
  • Jup, auch nicht schlecht. Braucht wohl eine halbe Sekunde mehr zum lesenden Verstehen, aber hat was an sich.^^

    Der Punkt ist halt, daß man aus der Filter-Closure auf einen höheren Access-Scope (Remainder-Array) zurückgreifen muß. Das geht im Einzelfall natürlich auch ohne eine Array-Extension; die ist wohl letztendlich dann eigentlich nur für das Mutating da...

    Ich frage mich bei solchen Varianten oft, wie es da mit der Performance und dem Memory-Footprint aussieht. Bei C/Obj-C hat man ja so mit der Zeit seine Erfahrungswerte gesammelt. Aber bei Swift..? ?(

    Ähh... PS: Die Möglichkeit, daß die Closure eine Exception werfen kann, hast Du unterschlagen... :)
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?