Lineare Suche II

article header

Aktualisiert am 13. Januar 2018


Im Artikel “Lineare Suche in Swift und Python” habe ich die lineare Suche nach einem Integer-Wert in einem Array vorgestellt. Nun ist es etwas umständlich, für jeden Datentyp eine separate Such-Funktion schreiben zu müssen. Außerdem führt es zu nicht wünschenswerten Code-Wiederholungen.

In Swift sollte man daher Generics nutzen, um eine allgemeingültige Funktion zu erhalten:

let myArray = [4, 12, 17, 33, 11, 53]

func linearSearch<E: Equatable>(_ array:[E], _ object: E) -> String {
    for (i, value) in array.enumerated() where value == object {
        return String(i)
    }
    return "Value is not in the array."
}

var r1 = linearSearch(myArray, 17)
// -> 2
var r2 = linearSearch(myArray, 10)
// -> Value is not in the array.

Diese Funktion erlaubt beispielsweise auch eine Iteration über String-Elemente:

let myStringArray = ["Bochum", "Magdeburg", "Hamburg", "Nürnberg", "Bonn", "Stralsund"]

func linearSearch<E: Equatable>(_ array:[E], _ object: E) -> String {
    for (i, value) in array.enumerated() where value == object {
        return String(i)
    }
    return "Value is not in the array."
}

var r1 = linearSearch(myStringArray, "Hamburg")
// -> 2
var r2 = linearSearch(myStringArray, "München")
// -> Value is not in the array.

In Swift geht es aber aufgrund der Methode index(of:) noch einfacher:

let index = myStringArray.index(of: "Hamburg")
print(index!) // -> 2

Freilich ist es stets besser, dass Auspacken einer optionalen Variable nicht zu erzwingen:

let index = myStringArray.index(of: "München")
if let index = index {
    print(index)
} else {
    print("Value is not in the array.")
}

Zum Abschluss noch der Hinweis, dass index(of:) auch auf einzelne Zeichen eines Strings angewendet werden kann:

let myString = "Hello, World!"
let index = myString.characters.index(of: "d") // -> 11

Weiterführende Links: