2015-06-09 4 views
0

Я создаю тест, и у меня есть массив bools, и я пытаюсь найти способ подсчета количества «истинных» &10 «ложных» значений, поэтому Я могу представить результаты опроса пользователю. Я хотел бы сохранить результаты в переменной, которую я могу вызвать в более поздней точке.Как подсчитать 2 разных повторяющихся значения в массиве - Swift

Я посмотрел на набор типа коллекции, но не мог бы обернуть вокруг себя мою голову. Могу ли я включить в bool?

answersArray = [true, false, true, false, true, false, true] 

trueAnswersCount = set<Bool>() 

ответ

1

Вы можете просто перебирать массив и увеличивать его на единицу каждый раз, когда значение равно true.

Вот краткий пример:

var answersArray : [Bool] 

answersArray = [true, false, true, false, true, false, true] 

var nbTrueAnswers : Int = 0 

for value in answersArray { 
    if (value == true) { 
     nbTrueAnswers++; 
    } 
} 

println("nbTrueAnswers : \(nbTrueAnswers)") 

Или увидеть на: http://swiftstub.com/184888077/

Позвольте мне знать, если это помогло :)

+1

Сокращение: let nbTrueAnswers = reduce (answersArray, 0) {$ 0 + Int ($ 1)} ':) –

+0

@MartinR его не короче ... его кратчайший: P –

3

Вы не можете просто использовать родной Set потому что наборы не содержат повторяющихся значений. Например, следующее будет излучать {false, true}.

let answersArray = [true, false, true, false, true, false, true] 
let trueAnswersCount = Set<Bool>(answersArray) 

Если вы готовы использовать классы из Cocoa Touch, NSCountedSet упрощает это совсем немного.

let answersArray = [true, false, true, false, true, false, true] 

let countedSet = NSCountedSet() 
countedSet.addObjectsFromArray(answersArray) 

countedSet.countForObject(false) // 3 
countedSet.countForObject(true) // 4 

NSCountedSet еще множество, и только хранит уникальные значения, но он также отслеживает, сколько раз каждый уникальный элемент был добавлен к нему.

0

Вы могли бы сделать функцию, которая принимает SequenceType и значение и возвращает число раз, заданное значение соответствует элементу в последовательности:

func countMatches<Seq: SequenceType where Seq.Generator.Element: Equatable> 
       (arr: Seq, v: Seq.Generator.Element) -> Int { 

    return arr.reduce(0) { 
     if $1 == v { return $0 + 1 } 
     return $0 
    } 
} 

let answersArray = [true, false, true, false, true, false, true] 
countMatches(answersArray, true) // 4 
countMatches(answersArray, false) // 3 

Или, Swift 2:

extension SequenceType where Generator.Element: Equatable { 
    func countMatches(v: Generator.Element) -> Int { 
     return reduce(0) { 
      if $1 == v { return $0 + 1 } 
      return $0 
     } 
    } 
} 

let answersArray = [true, false, true, false, true, false, true] 
answersArray.countMatches(true) // 4 
answersArray.countMatches(false) // 3 
+0

Swift 1.2 does * not * требуется пустое имя параметра' _' , –

+0

Если я ошибаюсь, это изменилось между Xcode 6.3 (Swift 1.2) и Xcode 7 (Swift 2). –

+0

Мой плохой, ты прав; Я использовал Swift 2 при написании первой функции. – ABakerSmith

2

Почему бы просто не использовать filter()?

answersArray = [true, false, true, false, true, false, true] 

let trueCount = answersArray.filter { $0 == true }.count 
let falseCount = answersArray.filter { $0 == false }.count 
0

Вы можете легко использовать функциональное программирование мощности Swift получить очень краткое решение вашей проблемы:

let trueAnswersCount = answersArray.filter{$0 == true}.count 
0
var wordCounts = [String: Int]() 
    var allWords = ["this","is","a","test","this","is", "another", "test"] 
    for word in allWords { 
     if wordCounts[word] == nil { 
      wordCounts[word] = 1 
     } else { 
      wordCounts[word]! += 1 
     } 
    } 

    print(wordCounts) // prints: ["a": 1, "this": 2, "test": 2, "another": 1, "is": 2] 
    print(wordCounts["this"]!) // get the count of word "this": 2 
    allWords = Array(wordCounts.keys) // remove duplicates 

или даже быстрее:

var wordCounts: NSCountedSet! 
    var allWords = [true, true, false, false, false, false, true, false] as [Any] 

    wordCounts = NSCountedSet(array: allWords) 
    print(wordCounts.count(for: true)) // print: 3 

see details here

Смежные вопросы