2017-06-29 2 views
0

Ich habe ein Array von Objekten namens array und sein Typ ist votes. In den Objekten des Arrays gibt es ein Feld namens nameSubject, das ein String ist. Wie kann ich mein Array und die Zeichenfolge übergeben, die ich mit dem Namen des Betreffs vergleichen möchte? Dies ist meine Funktion:Binäre Suche: Fehler beim Übergeben des Arrays

static func binarySearch(inputArr: [votes], searchItem: String)->Int?{ 
    var lowerIndex = 0; 
    var upperIndex = inputArr.count - 1 

    while (true) { 
     var currentIndex = (lowerIndex + upperIndex)/2 
     if(inputArr[currentIndex] == searchItem) { 
      return currentIndex 
     } else if (lowerIndex > upperIndex) { 
      return nil 
     } else { 
      if (inputArr[currentIndex] > searchItem) { 
       upperIndex = currentIndex - 1 
      } else { 
       lowerIndex = currentIndex + 1 
      } 
     } 
    } 
} 

Der Fehler ist in der ersten und in der zweiten if und sagt dies: Binary Operator ‚==‘ kann nicht auf Operanden vom Typ ‚Stimmen‘ und ‚String‘“angewendet werden

+0

Was möchten Sie in der zweiten else-Anweisung tun? –

+0

Wenn Sie das oft machen, ist es besser, ein Dictionary Mapping 'nameSubject' zu' votes' Objekten zu machen – Alexander

+1

Nebenbei bemerkt, Swifts Konvention besteht aus UpperCamelCase, singulären Typen wie 'Vote' – Alexander

Antwort

0

Sie sollten die Zeichenfolge mit dem nameSubject String, nicht das Objekt selbst Objekt vergleichen

Also der Vergleich Sie ist machen sollte. Obwohl

inputArr[currentIndex].nameSubject == searchItem 

Dies hilft nicht beim Vergleich, den Sie danach machen. Ich bin mir nicht sicher, welche Eigenschaft, die Sie mit dem bewerten versuchen „>“

1

Hier ist, wie ich das schreiben würde:

// Precondition: the array is sorted by ascending elements 
extension Array where Element: Comparable { 
    func binarySearchForIndex(of desiredElement: Element) -> Int? { 
     return binarySearchForIndex(of: desiredElement, by: {$0}) 
    } 
} 

// Precondition: the array is sorted by ascending values of the picker closure. 
extension Array { 
    func binarySearchForIndex<T>(
     of desiredElement: T, 
     by picker: (Element) -> T 
    ) -> Int? 
    where T: Comparable { 
     var lowerIndex = 0; 
     var upperIndex = self.count - 1 

     while (true) { 
      let currentIndex = (lowerIndex + upperIndex)/2 
      let item = picker(self[currentIndex]) 

      if item == desiredElement { return currentIndex } 
      else if lowerIndex > upperIndex { return nil } 
      else { 
       if (item > desiredElement) { 
        upperIndex = currentIndex - 1 
       } else { 
        lowerIndex = currentIndex + 1 
       } 
      } 
     } 
    } 
} 

Die erste Erweiterung, die Sie binäre Suche über jeden Array von Comparable tun kann Artikel direkt.

Die zweite Erweiterung ermöglicht die binäre Suche über alle Array Elemente, die eine Schließung bieten, die angibt, welche der Eigenschaften des Elements Sie suchen möchten. Sie könnten etwas tun wie:

let indexOfBobsVote = votes 
    .sorted{ $0.nameSubject < $0.nameSubject} 
    .binarySearchForIndex(of: "bob", by: { $0.nameSubject })