swift - 如何使用 swift 将变量数组分成更小的数组

标签 swift macos swift3

我有个问题想不明白。有没有更简单的方法将一个数组分成其他数组。在下面的代码中,我执行跟踪路由并过滤掉除 ping 速率之外的所有内容。

然后我将该数组分解为单独的节点。唯一的缺点是,如果只需要 2 跳,那么我会收到错误“ fatal error :索引超出范围”。因为我将其设置为创建 15 个节点数组。我也尝试过放..

let count = pingRate.count
if count < 15 {
aNodeArray += pingRate[14]
}

有没有更简单的方法?我希望有一种方法可以执行 .count 然后填充每个节点上所需的 Int 。

let task = Process()
    task.launchPath = "/bin/sh"
    task.arguments = ["-c", "traceroute -nm 15 -q 1 8.8.8.8"]

    let pipe = Pipe()
    task.standardOutput = pipe
    task.launch()
    let data = pipe.fileHandleForReading.readDataToEndOfFile()
    let output = NSString(data: data, encoding: String.Encoding.utf8.rawValue) as! String
    var array = output.components(separatedBy: " ")

    array = array.filter({ $0.contains(".")})
    let pingRate: [[Double]] = array.enumerated().filter({ index, _ in
        index % 2 != 0
    }).map { [Double($0.1)!] }
    let aNode = pingRate[0]
    let bNode = pingRate[1]
    let cNode = pingRate[2]
    let dNode = pingRate[3]
    let eNode = pingRate[4]

    aNodeArray += aNode
    bNodeArray += bNode
    cNodeArray += cNode
    dNodeArray += dNode
    eNodeArray += eNode

完成后,我会排序并找到最小值、最大值和平均值。

    let sorted = aNodeArray.sorted()
    let numbers = sorted
    print(numbers)
    let min = numbers[0]

    var sum = 0 as Double
    for number in numbers {
        sum += number
    }
    let mean = Double(sum) /
        Double (numbers.count)
    let x = mean
    let avg = round(1000.0 * x) / 1000.0
    let maxBR = numbers.last! as Double
    let max = round(1000.0 * maxBR) / 1000.0

    print(min)
    print(max)
    print(avg)

编辑

我确实偶然发现了一些 block 并大步从...... Swift: what is the right way to split up a [String] resulting in a [[String]] with a given subarray size?

我正在尝试找到一种方法来实现我的需求

编辑

然后查看该代码。谁能告诉我为什么在 process() 完成之前我会得到彩色旋转轮?

最佳答案

我知道有更有效的算法来计算 ping 速率统计数据,但下面的代码应该可以完成这项工作。

let task = Process()
task.launchPath = "/bin/sh"
task.arguments = ["-c", "traceroute -nm 15 -q 1 8.8.8.8"]
let pipe = Pipe()
task.standardOutput = pipe
task.launch()

let data = pipe.fileHandleForReading.readDataToEndOfFile()
guard
  let pingRates = String(data: data, encoding: .utf8)?
    .components(separatedBy: " ")
    .filter({ $0.contains(".") })
    .flatMap({ Double($0) }),
  pingRates.count > 0
else {
  return
}
print("ping rate(min) = \(pingRates.min()!.rounded())")
print("ping rate(max) = \(pingRates.max()!.rounded())")
print("ping rate(avg) = \((pingRates.reduce(0, +) / Double(pingRates.count)).rounded())")

消除输出中 IP 地址的技巧是让 Double.init 在它们上失败,然后 flatMap 将删除这些 nil 值。

关于swift - 如何使用 swift 将变量数组分成更小的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43127786/

相关文章:

ios - 检查互联网连接是否可用

ios - indexPathForRow 不会返回正确的值

ios - ld : 1 duplicate symbol for architecture arm64, swift3 中的两个 SDK

iOS 8 UICollectionViewLayout 在 Swift 中切换神秘崩溃

swift - 如何取消订阅可观察对象?

ios - 给 UIImageView 添加动画

python - 无法让 Jython 在 Mac 上工作

c++ - OS X 上 C++ 中的 sleep 操作

macos - 将 OpenCV 部分图像转换为 NSImage

json - 几秒钟后快速刷新 JSON 数据