Swift中是否有一个函数可以检查数组的所有元素是否具有相同的值?就我而言,它是一个type数组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
}
可以使用以下contains()
函数来代替显式循环:
func allEqualUsingContains<T : Equatable>(array : [T]) -> Bool {
if let firstElem = array.first {
return !contains(array, { $0 != firstElem })
}
return true
}
如果数组元素是Hashable
(例如Int
),则可以Set
从数组元素创建一个(从Swift 1.2开始可用),并检查它是否恰好具有一个元素。
func allEqualUsingSet<T : Hashable>(array : [T]) -> Bool {
let uniqueElements = Set(array)
return count(uniqueElements) <= 1
}
快速基准测试显示,对于包含1,000,000个整数的数组,“包含”方法比“设置”方法快得多,尤其是在元素 不
完全相等的情况下。这是有道理的,因为contains()
一旦找到不匹配的元素就返回,而Set(array)
总是遍历整个数组。
同样,“包含”方法比显式循环同样快或稍快。
这是一些简单的基准测试代码。当然,结果可能会随数组大小,不同元素的数量和元素数据类型而变化。
func measureExecutionTime<T>(title: String, @noescape f : (() -> T) ) -> T {
let start = NSDate()
let result = f()
let end = NSDate()
let duration = end.timeIntervalSinceDate(start)
println("\(title) \(duration)")
return result
}
var array = [Int](count: 1_000_000, repeatedValue: 1)
array[500_000] = 2
let b1 = measureExecutionTime("using loop ") {
return allEqualUsingLoop(array)
}
let b2 = measureExecutionTime("using contains") {
allEqualUsingContains(array)
}
let b3 = measureExecutionTime("using set ") {
allEqualUsingSet(array)
}
结果(在MacBook Pro上,发布配置):
使用循环0.000651001930236816 使用包含0.000567018985748291 使用设置0.0344770550727844
随着array[1_000] = 2
结果
使用循环9.00030136108398e-06 使用包含2.02655792236328e-06 使用设置0.0306439995765686
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
}
但是您现在也可以将其定义为数组的扩展方法:
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
我想用Java做一个小游戏swing,但我想不出一个解决问题的好方法。我有两个阵列,第一个是板条箱 第二个是Tile对象。 我想检查一下是否所有的板条箱都放在瓷砖上。我的意思是,不管哪个盒子在哪个瓷砖上,都有几个盒子,几个瓷砖,每个盒子都应该放在一块瓷砖上,不管哪个盒子在哪个瓷砖上。在游戏中,玩家行走并移动箱子,所以他们的坐标会发生变化。瓷砖坐标不变(如果可能有帮助的话)。这将是我的停止状态。当板
如何检查两个数组(循环)是否具有相同顺序的相同元素。例如,让我们以数组[1,2,3,4]为例。 对于[2,3,4,1]、[3,4,1,2]、[4,1,2,3],测试应返回true,但对于[1,3,2,4]、[1,4,2,3]或[1,2,3,5]则不返回true。 我最初的方法是找到第一个匹配项——每个数组中一个相等的元素——并将这两个元素视为各自数组的初始元素,我逐个比较了数组的其余元素。 有没有
问题内容: 我需要以下功能: 输入: 输出: 如果输入列表中的所有元素使用标准相等运算符求值彼此相等; 除此以外。 性能:当然,我不希望产生任何不必要的开销。 我觉得最好: 遍历列表 比较相邻元素 和AND所有结果布尔值 但我不确定最Pythonic的方法是什么。 问题答案: 通用方法: 单线: 也是单线的: 这三个版本之间的区别在于: 在内容中必须是可哈希的。 并且可以使用任何迭代器,但chec
本文向大家介绍查找所有元组在Python中是否具有相同的长度,包括了查找所有元组在Python中是否具有相同的长度的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将找出给定列表中的所有元组是否具有相同的长度。 与伦 我们将使用len函数并将其结果与我们正在验证的给定值进行比较。如果值相等,那么我们认为它们的长度相同,否则就不一样。 示例 输出结果 运行上面的代码给我们以下结果- 与所有人和
我试图获取数组的每个元素并检查它是否是回文。如果给定数组中的所有元素都是回文,那么它应该返回1,如果不是,那么它应该返回0。 例如输入5 111 222 333 444 555预期输出1我的输出0 谢谢你的帮助。
问题内容: 我对Python中的字典有疑问。 这里是: 我有一个像 现在,我想通过相同的值获取所有关键元素,并将其保存在新的字典中。 新的Dict应该如下所示: 问题答案: 如果您对新字典中的列表而不是元组感到满意,则可以使用 如果您想避免使用,也可以这样做