Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.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 基于下一个对象的过滤器数组_Arrays_Swift - Fatal编程技术网

Arrays 基于下一个对象的过滤器数组

Arrays 基于下一个对象的过滤器数组,arrays,swift,Arrays,Swift,我正在写一些代码来过滤运动传感器的驾驶行程。我发现最好的方法是根据以下内容向嵌套数组添加子数组: 检测首次发生的可靠汽车事件 将以下所有运动事件添加到相同的事件数组中,直到第一个自信的观察结果表明不是这样 比如说 automotive confidence 2 //Add automotive confidence 2 //Add automotive confidence 2 //Add walking confidence 2 //Add the sub-array to the mas

我正在写一些代码来过滤运动传感器的驾驶行程。我发现最好的方法是根据以下内容向嵌套数组添加子数组:

  • 检测首次发生的可靠汽车事件
  • 将以下所有运动事件添加到相同的事件数组中,直到第一个自信的观察结果表明不是这样
比如说

automotive confidence 2 //Add
automotive confidence 2 //Add
automotive confidence 2 //Add
walking confidence 2 //Add the sub-array to the master array and start over on the next confident automotive event. 
目前我是这样做的:

        //Remove all uncertain values.
        let confidentActivities = activities!.filter{$0.confidence.rawValue == 2}

        var needsNew = true
        var automotiveActivities:Array<Array<CMMotionActivity>> = Array() //Master array to contain subarrays of automotiveactivity arrays
        var automotiveActivitySession:Array<CMMotionActivity> = Array()
        for activity in confidentActivities {
            if activity.automotive && (!activity.cycling && !activity.running && !activity.walking){
                if needsNew {
                    needsNew = false
                }
                automotiveActivitySession.append(activity)
            } else {
                if !needsNew {
                    //If user is no longer in car, store a cpoy of the session and reset the array
                    automotiveActivities.append(Array(automotiveActivitySession))
                    automotiveActivitySession = []
                    needsNew = true
                }
            }
        }
//删除所有不确定值。
让自信=活动!。筛选器{$0.confidence.rawValue==2}
var needsNew=true
var automotiveActivities:Array=Array()//主数组包含automotiveactivity数组的子数组
var automotiveActivitySession:Array=Array()
用于秘密活动中的活动{
如果activity.automotive&&(!activity.cycling&&!activity.running&&!activity.walking){
如果需要新的{
needsNew=false
}
automotiveActivitySession.append(活动)
}否则{
如果!需要新的{
//如果用户已不在车内,请存储会话的cpoy并重置阵列
automotiveActivities.append(数组(automotiveActivitySession))
自动激活会话=[]
needsNew=true
}
}
}
这个解决方案不是很优雅。
有没有办法使用Swift的
Array.filter{}
使排序更美观

过滤器不会执行此操作,但您可以使用
reduce

下面的示例显示了如何将连续运行的
“A”
s(表示汽车事件)收集到阵列阵列中的阵列中:

let data = ["A","A","A","B","A","A","B","A","A","A","A","B","B","B","A","B","A","A","A","A","A","A","B","A"]
var res = [[String]]()
_ = data.reduce("") { (last: String, current: String) in
    if current == "A" {
        if last != "A" {
            res.append([String]())
        }
        res[res.count-1].append(current)
    }
    return current
}
print(res)
先验值作为第一个参数传递给
reduce
函数。这使得函数可以决定是追加到当前列表还是启动新列表

这次运行的结果如下:

[   ["A", "A", "A"]
,   ["A", "A"]
,   ["A", "A", "A", "A"]
,   ["A"]
,   ["A", "A", "A", "A", "A", "A"]
,   ["A"]]

如果您想要一个漂亮的解决方案,您可以使用
split
来实现这一点。您只需为它提供一个条件,即应该将其视为分隔符。在您的情况下,这将是任何非汽车运动事件

let arr = ["A","A","A","B","A","A","B","A","A","C","A","B","D","B","A","B","A","E","A","A","F","A","B","A","B"]
let split = arr.split {$0 != "A"} // insert your condition for whether the given element should be considered a 'seperator'
$0
这里是数组中某个元素的匿名闭包参数(当它迭代时)。尽管闭包看起来不那么优雅,但您始终可以扩展闭包以使命名更明确。例如:

let split = arr.split {element in
    return element != "A"
}
这将返回一个
ArraySlices
数组,如下所示:

[
    ArraySlice(["A", "A", "A"]),
    ArraySlice(["A", "A"]),
    ArraySlice(["A", "A"]),
    ArraySlice(["A"]),
    ArraySlice(["A"]),
    ArraySlice(["A"]),
    ArraySlice(["A", "A"]),
    ArraySlice(["A"]),
    ArraySlice(["A"])
]
如果希望它们是显式的
数组
,您只需在之后使用
映射

let split = arr.split {$0 != "A"}.map{Array($0)}
返回:

[
    ["A", "A", "A"],
    ["A", "A"],
    ["A", "A"],
    ["A"], ["A"],
    ["A"],
    ["A", "A"],
    ["A"],
    ["A"]
]