当前位置: 首页 > 面试题库 >

快速比较数组

邵飞鸿
2023-03-14
问题内容

试图了解如何比较数组。

var myArray1 : [String] = ["1","2","3","4","5"]
var myArray2 : [String] = ["1","2","3","4","5"]

// 1) Comparing 2 simple arrays

if(myArray1 == myArray2) {
    println("Equality")
} else {
    println("Equality no")
}
// -> prints equality -> thanks god

// 2) comparing to a "copy" of an array

// swift copies arrays when passed as parameters (as per doc)
func arrayTest(anArray: [String]) -> Bool {
    return anArray == myArray1
}

println("Array test 1 is \(arrayTest(myArray1))")
println("Array test 2 is \(arrayTest(myArray2))")
// equality works for both

myArray2.append("test")
println("Array test 2 is \(arrayTest(myArray2))")
// false (obviously)

myArray2.removeAtIndex(5)
println("Array test 2 is \(arrayTest(myArray2))")
// true

苹果表示,阵列拷贝背后存在优化。看起来有时(并非总是)结构实际上是否被复制。

那就是

1)==遍历所有数组以执行基于元素的比较吗?(看起来像)->那么在非常大的阵列上的性能/内存使用情况如何?

2)我们确定如果所有元素都相等,==会返回true吗?我对Java字符串的==记忆犹新

3)有没有一种方法可以检查myArray1和myArray2在技术上是否使用相同的“内存位置” /指针/等?我正在了解优化的工作原理和潜在的警告。

谢谢。


问题答案:

您应该对以下内容有些紧张==

struct NeverEqual: Equatable { }
func ==(lhs: NeverEqual, rhs: NeverEqual)->Bool { return false }
let x = [NeverEqual()]
var y = x
x == y  // this returns true

[NeverEqual()] == [NeverEqual()] // false
x == [NeverEqual()] // false

let z = [NeverEqual()]
x == z // false

x == y // true

y[0] = NeverEqual()
x == y // now false

为什么?Swift数组不符合Equatable,但它们确实有一个==运算符,在标准库中定义为:

func ==<T : Equatable>(lhs: [T], rhs: [T]) -> Bool

这个操作符遍历中的元素lhsrhs,在每个位置进行比较的值。它并 没有 做比较按位-
它调用的==每个元素对运营商。这意味着,如果您==为元素编写一个自定义,它将被调用。

但是它包含一个优化-如果两个数组的基础缓冲区相同,就不会打扰,它只会返回true(它们包含相同的元素,当然它们是相等的!)。

这个问题完全是NeverEqual平等运算符的错。平等应该是可传递的,对称的和反身的,而这一平等不是反身的(x == x是错误的)。但是它仍然可能使您无意识。

Swift数组是写时复制的-因此,在编写时,var x = y它实际上并不能复制该数组,而只是将其x存储缓冲区指针指向y。只有在稍后更改x或时y,它才会创建缓冲区的副本,以使未更改的变量不受影响。这对于数组的行为类似于值类型,但仍然具有高性能至关重要。

在早期的Swift版本中,您实际上可以调用===数组(同样在早期的版本中,变异行为也有所不同,如果您进行了mutation
xy即使已声明为,也会改变let-吓坏了人们,所以他们改变了它) 。

您可以===使用以下技巧重现on数组的旧行为(除了依赖于戳和探查调查,不依赖于实现,这完全依赖于实现)技巧:

let a = [1,2,3]
var b = a

a.withUnsafeBufferPointer { outer in 
    b.withUnsafeBufferPointer { inner in 
        println(inner.baseAddress == outer.baseAddress) 
    } 
}


 类似资料:
  • 问题内容: 题: 我需要比较2次-当前时间和设定时间。如果设定的时间是将来的时间,请找出剩余的分钟数,直到所说的未来时间为止。 其他资讯: 我目前正在使用 我从关于SO的另一个答案中窃取了有关如何以Int格式获取当前时间的信息。然后,我将未来时间分为小时(Int)和分钟(Int)并进行比较…但是,当您越过小时障碍时,这变得很奇怪。 问题答案: 您具有比较功能来比较2个NSDate来知道哪个是最新的

  • 问题内容: 我想更改按钮状态为不同的状态。我这样尝试: 但是在第一个按钮println中,打印nil且背景变为红色;在第二个按钮println中,打印“ Optional(UIDeviceRGBColorSpace 1 0 0 1)”,并且颜色不变 问题答案: 您不使用运算符比较颜色。您可以这样操作,并且需要打开可选的颜色: 另外,请删除分配声明中的无关内容。它应该是:

  • 问题内容: 我听说散列(即将字符串或对象转换为数字)用于字符串等,因为比较数字比字符串更容易。如果为真,这是什么原因? 问题答案: 不一定是这种情况,但大多数时候可能是这样。 请考虑以下情况: 我想比较字符串“ apples”和“ oranges”。如果我只想确定“ apples” ==“ oranges”,我只需要比较每个字符串的第一个字符:’a’!=’o’=>“ apples”!=“ oran

  • 我想比较有多少掉期和比较( 我的泡泡裙: 我的快速排序: 解决方案:

  • 本文向大家介绍比较排序之快速排序(实例代码),包括了比较排序之快速排序(实例代码)的使用技巧和注意事项,需要的朋友参考一下 快速排序(简称快排)因为其效率较高(平均O(nlogn))经常在笔试题中对其考查。 对于快排的第一步是选取一个“基数”,将会用这个“基数”与其它数进行比较交换。而这个“基数”的选择将影响到快排的效率如何,但如果为了选择基数而选择基数则会本末倒置。例如为了找到最佳基数,则需要在

  • 问题内容: 它们看起来几乎一样,甚至是语法? 使用什么?或什么时候使用什么? 问题答案: 速度不再是真正活跃的开发。Freemarker是。 根据我的经验,Freemarker也更加灵活。