Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 检查数组的所有元素在Swift中是否具有相同的值_Arrays_Swift - Fatal编程技术网

Arrays 检查数组的所有元素在Swift中是否具有相同的值

Arrays 检查数组的所有元素在Swift中是否具有相同的值,arrays,swift,Arrays,Swift,Swift中是否有检查数组中所有元素是否具有相同值的函数?在我的例子中,它是一个类型为Int的数组。我知道我可以使用一个简单的for循环来迭代它,我只是想知道是否有内置的更快的方法。任何方法都必须迭代所有元素,直到找到不同的元素: func allEqualUsingLoop<T : Equatable>(array : [T]) -> Bool { if let firstElem = array.first { for elem in array {

Swift中是否有检查数组中所有元素是否具有相同值的函数?在我的例子中,它是一个类型为
Int
的数组。我知道我可以使用一个简单的for循环来迭代它,我只是想知道是否有内置的更快的方法。

任何方法都必须迭代所有元素,直到找到不同的元素:

func allEqualUsingLoop<T : Equatable>(array : [T]) -> Bool {
    if let firstElem = array.first {
        for elem in array {
            if elem != firstElem {
                return false
            }
        }
    }
    return true
}
如果数组元素是可散列的(例如
Int
),则可以 从数组元素创建一个
集合
(从Swift 1.2开始提供),并检查它是否只有一个元素

func allEqualUsingSet<T : Hashable>(array : [T]) -> Bool {
    let uniqueElements = Set(array)
    return count(uniqueElements) <= 1
}
结果(在MacBook Pro上,版本配置):


Swift 2/Xcode 7的更新:由于Swift中的各种更改 语法,函数现在编写为

func allEqual<T : Equatable>(array : [T]) -> Bool {
    if let firstElem = array.first {
        return !array.dropFirst().contains { $0 != firstElem }
    }
    return true
}

Swift 4.2/Xcode 10的解决方案:

let arr = [1, 1, 1, 1]
let allItemsEqual = arr.dropLast().allSatisfy { $0 == arr.last }
print(allItemsEqual)

如果您当前的Xcode版本早于10.0,您可以在中找到
ArraySlice
AllConfect
。您可以使用cocoapod安装此库

使用Swift 5,您可以使用以下四种方法之一来测试数组的所有元素是否相等


#1.使用
数组
的方法
allsuccess(:)
返回一个布尔值,指示序列中的每个元素是否满足给定谓词。您可以将谓词设置为测试数组的所有元素是否相等:

let array = [1, 1, 1]

let hasAllItemsEqual = array.dropFirst().allSatisfy({ $0 == array.first })
print(hasAllItemsEqual) // prints: true

#2.使用
数组
的方法 作为
所有满足(:)
的替代方法,您可以使用
减少(::)


#3.使用方法
elementsEqual(:)
返回一个布尔值,指示两个序列是否以相同顺序包含相同的元素。因此,您可以通过重复初始数组的第一个元素来创建新集合,并将前者与后者进行比较:

let array = [1, 1, 1]

precondition(!array.isEmpty)
let repeated = repeatElement(array[0], count: array.count)

let hasAllItemsEqual = array.elementsEqual(repeated)
print(hasAllItemsEqual) // prints: true

#4.使用
设置
的初始化器
如果一个数组的所有元素都相等,则从此数组创建一个集合应导致该集合只有一个元素:

let array = [1, 1, 1]

let set = Set(array)
let hasAllItemsEqual = set.count <= 1
print(hasAllItemsEqual) // prints: true
let数组=[1,1,1]
设集合=集合(数组)

让hasAllItemsEqual=set.count尝试相同的。。。已检查编译器;-)如果您有兴趣尝试另一个,可以使用
equal
Repeat
array.first.map{equal(array,Repeat(count:array.count,repeatedValue:$0))??真的
(它比较慢)@AirspeedVelocity:它比较慢,但不会太快:使用
数组[500_000]=2
我测量的是0.001789秒,使用
数组[1_000]=2
3.99e-06秒。是的,检查它们的长度是否相同(尽管这并不重要)。这是一个很好的答案!感谢您不需要
dropLast()
@Sulthan在这里添加
dropLast()
很重要。在我的示例中,如果我删除
dropLast()
,传递给
allsuccess
的块将被调用4次,但现在它只调用3次,结果是相同的。您不需要它。复杂性是关键same@Lirik您可以添加自己的答案,并解释为什么不应该有
dropLast()
。我理解检查最后一个对象是否等于它本身是多余的,但是检查数组3次或4次在CS术语中具有相同的复杂性,所以这并不重要。
extension Array where Element : Equatable {
    func allEqual() -> Bool {
        if let firstElem = first {
            return !dropFirst().contains { $0 != firstElem }
        }
        return true
    }
}

print([1, 1, 1].allEqual()) // true
print([1, 2, 1].allEqual()) // false
let arr = [1, 1, 1, 1]
let allItemsEqual = arr.dropLast().allSatisfy { $0 == arr.last }
print(allItemsEqual)
let array = [1, 1, 1]

let hasAllItemsEqual = array.dropFirst().allSatisfy({ $0 == array.first })
print(hasAllItemsEqual) // prints: true
let array = [1, 1, 3]

let hasAllItemsEqual = array.dropFirst().allSatisfy({ $0 == array.first })
print(hasAllItemsEqual) // prints: false
let array = [Int]()

let hasAllItemsEqual = array.dropFirst().allSatisfy({ $0 == array.first })
print(hasAllItemsEqual) // prints: true
let array = [1, 1, 1]

let hasAllItemsEqual = array.dropFirst().reduce(true) { (partialResult, element) in
    return partialResult && element == array.first
}
print(hasAllItemsEqual) // prints: true
let array = [1, 1, 3]

let hasAllItemsEqual = array.dropFirst().reduce(true) { (partialResult, element) in
    return partialResult && element == array.first
}
print(hasAllItemsEqual) // prints: false
let array = [Int]()

let hasAllItemsEqual = array.dropFirst().reduce(true) { (partialResult, element) in
    return partialResult && element == array.first
}
print(hasAllItemsEqual) // prints: true
let array = [1, 1, 1]

precondition(!array.isEmpty)
let repeated = repeatElement(array[0], count: array.count)

let hasAllItemsEqual = array.elementsEqual(repeated)
print(hasAllItemsEqual) // prints: true
let array = [1, 1, 3]

precondition(!array.isEmpty)
let repeated = repeatElement(array[0], count: array.count)

let hasAllItemsEqual = array.elementsEqual(repeated)
print(hasAllItemsEqual) // prints: false
let array = [1, 1, 1]

let set = Set(array)
let hasAllItemsEqual = set.count <= 1
print(hasAllItemsEqual) // prints: true
let array = [1, 1, 3]

let set = Set(array)
let hasAllItemsEqual = set.count <= 1
print(hasAllItemsEqual) // prints: false
let array = [Int]()

let set = Set(array)
let hasAllItemsEqual = set.count <= 1
print(hasAllItemsEqual) // prints: true