如何在数组中计算2个不同的重复值 - Swift

时间:2015-06-09 13:33:26

标签: arrays swift set boolean

我正在创建一个测验,我有一系列的bool,我正试图找到一种方法来计算有多少“真实”&有“假”值,所以我可以将测验结果呈现给用户。我想将结果存储在我稍后可以调用的变量中。

我看过set集合类型,但似乎无法绕过它。我将初学者设定为布尔吗?

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

trueAnswersCount = set<Bool>()

6 个答案:

答案 0 :(得分:3)

您不能只使用原生的Set类型,因为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仍然是一个Set,只存储唯一值,但它也跟踪每个唯一元素添加到它的次数。

答案 1 :(得分:2)

为什么不使用filter()

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

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

答案 2 :(得分:1)

您可以简单地遍历数组,并在每次值为true时递增1。

这是一个简单的例子:

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/

如果有帮助,请告诉我:)。

答案 3 :(得分: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

答案 4 :(得分:0)

您可以轻松使用Swift的函数编程功能为您的问题获得一个非常简洁的解决方案:

lock(_lock_) //whose there? it's me, I kill you! oops sorry that was knock knock
{
    //do what you want
}

答案 5 :(得分: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