Arrays 检查数组的所有元素在Swift中是否具有相同的值
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 {
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