Arrays 迭代数组并计算从负到正的更改(反之亦然)

Arrays 迭代数组并计算从负到正的更改(反之亦然),arrays,swift,enumeration,Arrays,Swift,Enumeration,我用CoreMotion的陀螺仪数据来确定装置运动的Z方向。这将返回一个双精度数组。积极向前,消极向后。我现在想数一数这个装置朝一个方向移动了多少次。向相反方向移动将是一个计数 所以我试图计算数组中值从正值变为负值或从负值变为正值的次数。如果这是数组,则计数为3 let array = [1, 2, 3, 4, -1, -1, -2, -3, 1, 2, 3, -1, -2] 可以在一行中完成吗?我觉得我完全把这段代码复杂化了: var count = 0 var isPositive = f

我用CoreMotion的陀螺仪数据来确定装置运动的Z方向。这将返回一个双精度数组。积极向前,消极向后。我现在想数一数这个装置朝一个方向移动了多少次。向相反方向移动将是一个计数

所以我试图计算数组中值从正值变为负值或从负值变为正值的次数。如果这是数组,则计数为3

let array = [1, 2, 3, 4, -1, -1, -2, -3, 1, 2, 3, -1, -2]
可以在一行中完成吗?我觉得我完全把这段代码复杂化了:

var count = 0
var isPositive = false

for (index, value) in array.enumerated() {

  if isPositive == false {
      if value > 0 {
          isPositive = true
          count += 1
      }
   } else {
      if value < 0 
          isPositive = false
          count += 1
      }
   }
}
var计数=0
var isPositive=false
对于数组中的(索引,值)。枚举(){
如果isPositive==false{
如果值>0{
isPositive=true
计数+=1
}
}否则{
如果值<0
isPositive=假
计数+=1
}
}
}

谢谢

注意:要计算哪些对的确切逻辑可能会发生变化,因为我还不确定您要查找什么。它应该足够简单,以便在必要时进行适当的更改

首先,我要澄清我们在寻找什么样的过渡。我将研究从负数(小于0)到非负数(0和所有正数)的转换。我将通过以下扩展来简化此过程:

extension Integer {
    var isNonNegative: Bool { return !isNegative }
    var isNegative: Bool { return self < 0 }
}
这导致了以下几对:

[(1, 2), (2, 3), (3, 4), (4, -1), (-1, -1), (-1, -2), (-2, -3), (-3, 1), (1, 2), (2, 3), (3, -1), (-1, -2)]
从这里开始,只需计算第一个元素(
.0
)为负,第二个元素(
.1
)为正的对数。像这样:

let numRisingEdges = pairs.reduce(0) { count, pair in
    if pair.0.isNegative && pair.1.isNonNegative { return count + 1 }
    else { return count }
}

print(numRisingEdges) // => 1

我不喜欢我之前的答案,所以这里有一个稍微不同的方法:

    let array = [1, 1, 2, 3, 4, -1, -1, -2, -3, 1, 2, 3, -1, -2]
    func sign(_ i: Int) -> Int {
        switch true {
        case i > 0: return 1
        case i < 0: return -1
        default: return 0
        }
    }
    let result = array.map{sign($0)}.reduce([Int]()) { arr, cur in
        var arr = arr
        if arr.count == 0 {
            arr.append(cur)
        } else if arr.last! != cur {
            arr.append(cur)
        }
        return arr
    }
    print(result.count-1) // 3
let数组=[1,1,2,3,4,-1,-1,-2,-3,1,2,3,-1,-2]
func符号(i:Int)->Int{
切换为真{
案例i>0:返回1
案例一<0:返回-1
默认值:返回0
}
}
让result=array.map{sign($0)}.reduce([Int]()){arr,cur-in
var-arr=arr
如果arr.count==0{
arr.append(当前)
}否则,如果arr.last!!=cur{
arr.append(当前)
}
返回arr
}
打印(result.count-1)//3

我们的想法是将
arr
作为符号更改的草稿行进行维护。但是第一个条目不算数,因为前面没有任何条目,所以可以通过从总的更改计数中减去1来贴现它。

这个问题适用于不在这里您说的
从正值到负值
我只看到了2次,而不是3次<代码>4-->
-1
3
-->
-1
0算什么,正还是负?毫无意义。如果我们有[1,0,-1]呢。答案应该是什么?我们从来没有从正数到负数,因为我们通过了0,而0既不是正数也不是负数。您的规范有缺陷。除了所有警告之外,您的代码根本不起作用,因为您假设初始值为负值,并且在每次迭代开始时,
count
isPositive
都重置为
0/false
。最后一个开口支架不见了。谢谢@Alexander-会给它一个机会的。太棒了!谢谢你,谢谢马特!这也很有效!为最初不清楚的问题道歉。谢谢你的时间。没问题,我只是想展示一种替代方法。
    let array = [1, 1, 2, 3, 4, -1, -1, -2, -3, 1, 2, 3, -1, -2]
    func sign(_ i: Int) -> Int {
        switch true {
        case i > 0: return 1
        case i < 0: return -1
        default: return 0
        }
    }
    let result = array.map{sign($0)}.reduce([Int]()) { arr, cur in
        var arr = arr
        if arr.count == 0 {
            arr.append(cur)
        } else if arr.last! != cur {
            arr.append(cur)
        }
        return arr
    }
    print(result.count-1) // 3