570 Stimmen

Wie man überprüft, ob ein Element in einem Array vorhanden ist

In Swift, wie kann ich überprüfen, ob ein Element in einem Array vorhanden ist? Xcode hat keine Vorschläge für contain, include oder has, und eine schnelle Suche im Buch ergab nichts. Irgendeine Idee, wie man das überprüfen kann? Ich weiß, dass es eine Methode find gibt, die die Indexnummer zurückgibt, aber gibt es eine Methode, die wie Rubys #include? ein boolesches Ergebnis zurückgibt?

Beispiel, was ich brauche:

var elements = [1,2,3,4,5]
if elements.contains(5) {
  //etwas tun
}

26voto

dfrib Punkte 65037

(Swift 3)

Überprüfen, ob ein Element in einem Array existiert (bestimmte Kriterien erfüllt), und falls ja, mit dem ersten solchen Element weiterarbeiten

Wenn die Absicht ist:

  1. Zu überprüfen, ob ein Element in einem Array existiert (/bestimmte boolesche Kriterien erfüllt, nicht unbedingt Gleichheitsprüfung),
  2. Und wenn ja, dann mit dem ersten solchen Element weiterarbeiten,

Dann ist eine Alternative zu contains(_:) als blaubedruckt in Sequence zu first(where:) von Sequence:

let elements = [1, 2, 3, 4, 5]

if let firstSuchElement = elements.first(where: { $0 == 4 }) {
    print(firstSuchElement) // 4
    // ...
}

In diesem konstruierten Beispiel mag die Verwendung vielleicht albern erscheinen, aber es ist sehr nützlich, wenn Arrays von nicht grundlegenden Elementtypen auf das Vorhandensein von Elementen geprüft werden, die eine Bedingung erfüllen. Z. B.

struct Person {
    let age: Int
    let name: String
    init(_ age: Int, _ name: String) {
        self.age = age
        self.name = name
    }
}

let persons = [Person(17, "Fred"),   Person(16, "Susan"),
               Person(19, "Hannah"), Person(18, "Sarah"),
               Person(23, "Sam"),    Person(18, "Jane")]

if let eligableDriver = persons.first(where: { $0.age >= 18 }) {
    print("\(eligableDriver.name) kann möglicherweise das Mietauto in Schweden fahren.")
    // ...
} // Hannah kann möglicherweise das Mietauto in Schweden fahren.

let daniel = Person(18, "Daniel")
if let sameAgeAsDaniel = persons.first(where: { $0.age == daniel.age }) {
    print("\(sameAgeAsDaniel.name) ist im selben Alter wie \(daniel.name).")
    // ...
} // Sarah ist im selben Alter wie Daniel.

Alle verketteten Operationen mit .filter { ... some condition }.first können vorteilhafterweise durch first(where:) ersetzt werden. Letzteres zeigt die Absicht besser an und hat Leistungs­vorteile gegenüber möglichen nicht-lazy Anwendungen von .filter, da diese das gesamte Array passieren werden, bevor das (mögliche) erste Element, das den Filter passiert, extrahiert wird.


Überprüfen, ob ein Element in einem Array existiert (bestimmte Kriterien erfüllt), und falls ja, das erste solche Element entfernen

Ein Kommentar darunter fragt:

Wie kann ich das firstSuchElement aus dem Array entfernen?

Ein ähnlicher Anwendungsfall wie der oben ist, das erste Element zu entfernen, das einem bestimmten Prädikat genügt. Dazu kann die Methode index(where:) von Collection (die für Arrays verfügbar ist) verwendet werden, um den Index des ersten Elements zu finden, das das Prädikat erfüllt, wonach der Index mit der Methode remove(at:) von Array verwendet werden kann, um dieses Element zu entfernen (falls es existiert).

var elements = ["a", "b", "c", "d", "e", "a", "b", "c"]

if let indexOfFirstSuchElement = elements.index(where: { $0 == "c" }) {
    elements.remove(at: indexOfFirstSuchElement)
    print(elements) // ["a", "b", "d", "e", "a", "b", "c"]
}

Oder, wenn Sie das Element aus dem Array entfernen und damit arbeiten möchten, wenden Sie die Optionals map(_:) Methode an, um bedingt (für ein .some(...) Ergebnis von index(where:)) das Ergebnis von index(where:) zum Entfernen und Erfassen des entfernten Elements aus dem Array zu verwenden (innerhalb einer optionalen Bindungsklausel).

var elements = ["a", "b", "c", "d", "e", "a", "b", "c"]

if let firstSuchElement = elements.index(where: { $0 == "c" })
    .map({ elements.remove(at: $0) }) {

    // Wenn wir hier eintreten, wurde das erste solche Element jetzt
    // aus dem Array entfernt
    print(elements) // ["a", "b", "d", "e", "a", "b", "c"]

    // und wir können damit arbeiten
    print(firstSuchElement) // c
}

Beachten Sie, dass in dem konstruierten obigen Beispiel die Array-Elemente einfache Werttypen (String-Instanzen) sind, daher ist es etwas übertrieben, ein Prädikat zu verwenden, um ein bestimmtes Element zu finden. Stattdessen könnten wir einfach mit der einfacheren Methode index(of:) die Gleichheit überprüfen, wie in der Antwort von @DogCoffee gezeigt. Wenn wir jedoch den Find-and-Remove-Ansatz auf das Person-Beispiel anwenden, ist die Verwendung von index(where:) mit einem Prädikat angemessen (da wir nicht mehr auf Gleichheit, sondern auf die Erfüllung eines bereitgestellten Prädikats prüfen).

22voto

Honcharov Anton Punkte 232

Ein Array, das eine Eigenschaft enthält, die gleich ist

IhrArray.contains(where: {$0.propertyToCheck == Wert})

Gibt boolean zurück.

14voto

davetw12 Punkte 1687

Der einfachste Weg, dies zu erreichen, besteht darin, Filter auf dem Array zu verwenden.

let result = elements.filter { $0==5 }

result enthält das gefundene Element, wenn es existiert, und ist leer, wenn das Element nicht existiert. Also eine einfache Überprüfung, ob result leer ist, zeigt Ihnen, ob das Element im Array existiert. Ich würde folgendes verwenden:

if result.isEmpty {
    // Element existiert nicht im Array
} else {
    // Element existiert
}

10voto

Pramod More Punkte 1182

Swift 4/5

Ein weiterer Weg, dies zu erreichen, ist mit der Filter-Funktion

var elements = [1,2,3,4,5]
if let object = elements.filter({ $0 == 5 }).first {
    print("gefunden")
} else {
    print("nicht gefunden")
}

7voto

Sazzad Hissain Khan Punkte 33230

Array

let elements = [1, 2, 3, 4, 5, 5]

Überprüfen Sie das Vorhandensein von Elementen

elements.contains(5) // true

Holen Sie sich den Index der Elemente

elements.firstIndex(of: 5) // 4
elements.firstIndex(of: 10) // nil

Holen Sie sich die Anzahl der Elemente

let results = elements.filter { element in element == 5 }
results.count // 2

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X