2017-06-29 5 views
0

arrayというオブジェクトの配列があり、型がvotesです。配列のオブジェクトには、nameSubjectという文字列のフィールドがあります。 配列と文字列を渡したいのですが、件名と比較したいですか?これは私の関数である:バイナリ検索:配列を渡す際のエラー

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 
      } 
     } 
    } 
} 

エラーが最初におよび第二ifにあり、この言う:バイナリ演算子「==」がタイプのオペランドの投票 'と「文字列」」

に適用することはできません
+0

2番目のelse文で何をしようとしていますか? –

+0

これを頻繁にやっているのであれば、辞書の 'nameSubject'を' votes'オブジェクトにマッピングするほうが良いでしょう。 – Alexander

+1

Swiftのコンベンションでは、UpperCamelCaseという単数形の型があります。 – Alexander

答えて

0

あなたは、オブジェクトのnameSubject文字列ではなく、オブジェクト自体で文字列を比較する必要があり

をあなたが作るべき比較は次のとおりです。

inputArr[currentIndex].nameSubject == searchItem 

が、これはあなたがそれ以降に行っている比較に役立ちません。私はあなたがここで「>」

1

で評価しようとしているものプロパティわからないんだけど、私はこれを書くだろうかです:

// 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 
       } 
      } 
     } 
    } 
} 

最初の拡張は、あなたがComparableのいずれかのArray上でバイナリ検索を行うことができますアイテムを直接。

2番目の拡張機能では、アイテムのいずれのプロパティを検索するかを指定するクロージャを指定して、アイテムのArrayをバイナリ検索できます。

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