I am NOT looking for the Min/Max of an Element in an Array.

我希望通过比较数组中all the other elementssame propertyproperty of the element来识别元素.

我相信这很简单,因为有几个内置的数组方法(Min/Max)并指定了特定的Comparable/Equatable协议.在过go 的40年里,数组发生了很大的变化,我不知道如何实现我的目标.

详情/细节...

我有一个struct数组(JimGyro). 数组中 struct 体(gpsCt)的一个属性将有103个不同的重复值. 数组中 struct (measVal)的另一个属性将具有不同的值.

我的挑战

  • 我需要收集所有具有相同gpsCt的元素
    • 最少1个/最多gpsCt
  • 然后确定1-measVal子集中哪个元素的最大值为measVal
  • 将最大值measVal复制到同一元素subGrpMaxVal属性中.
  • 最后,将该元素复制到新数组中.

列表中的最后两个很容易,但我不太清楚实现这一点的嵌套循环(for/ForEach/Do While).

预先感谢您的任何/所有指针‼️

以下是我的 struct 和样例数组:

   struct JimGyro {
      var xGyro: Double
      var yGyro: Double
      var zGyro: Double
      var gpsCt: Int
      var measVal: Double
      var subGrpMaxVal: Double
   }

   var theArray = [
      JimGyro(xGyro: 0.0235, yGyro: 0.0351, zGyro: 0.0495, gpsCt: 1, measVal: 2.3, subGrpMaxVal: 0),
      JimGyro(xGyro: 0.0235, yGyro: 0.0351, zGyro: 0.0495, gpsCt: 1, measVal: 2.4, subGrpMaxVal: 0),
      JimGyro(xGyro: 0.0235, yGyro: 0.0351, zGyro: 0.0495, gpsCt: 1, measVal: 2.1, subGrpMaxVal: 0),
      JimGyro(xGyro: 0.0235, yGyro: 0.0351, zGyro: 0.0495, gpsCt: 2, measVal: 1.6, subGrpMaxVal: 0),
      JimGyro(xGyro: 0.0235, yGyro: 0.0351, zGyro: 0.0495, gpsCt: 2, measVal: 4.7, subGrpMaxVal: 0),
      JimGyro(xGyro: 0.0235, yGyro: 0.0351, zGyro: 0.0495, gpsCt: 3, measVal: 4.8, subGrpMaxVal: 0),
      JimGyro(xGyro: 0.0235, yGyro: 0.0351, zGyro: 0.0495, gpsCt: 3, measVal: 9.2, subGrpMaxVal: 0),
      JimGyro(xGyro: 0.0235, yGyro: 0.0351, zGyro: 0.0495, gpsCt: 3, measVal: 3.4, subGrpMaxVal: 0),
      JimGyro(xGyro: 0.0235, yGyro: 0.0351, zGyro: 0.0495, gpsCt: 3, measVal: 2.3, subGrpMaxVal: 0),
   ]
  • GPS坐标以1-ish per second的速率读取.
  • 陀螺仪数据以30-ish per second的速率读取.
    • ("ISH"是因为,由于各种原因,并非每个GPS读数正好对应30个陀螺仪读数.)
    • 因此,I 101只获取30个元素的区块.

推荐答案

我需要将具有相同gpsCt的所有元素集合在一起

这是一本词典,通过分组:

let byCount = Dictionary(grouping: theArray, by: \.gpsCt)

考虑到您对它的描述,不太清楚哪些元素应该更新subGrpMaxVal,但如果目标是收集列表中的所有最大值,并将subGrpMaxVal赋给这些元素,那么实现这一点的直接方法是使用循环:

var results: [JimGyro] = []
for group in byCount.values {
    // Find the maximum element (if any)
    if var maxElement = group.max(by: { $0.measVal < $1.measVal }) {
        // Update its subGrpMaxVal
        maxElement.subGrpMaxVal = maxElement.measVal

        // And return it
        results.append(maxElement)
    }
}

print(results)

如果你想把所有这些都打碎成一个FP-Chain,它应该是这样的:

let results = Dictionary(grouping: theArray, by: \.gpsCt)
    .values
    .compactMap { group in
        group.max(by: { $0.measVal < $1.measVal }).map {
            var maxElement = $0
            maxElement.subGrpMaxVal = maxElement.measVal
            return maxElement
        }
    }

(但我可能会使用循环...)

Swift相关问答推荐

自定义完整屏幕封面动画

什么是Swift Concurrency中任务组的正常退出

SwiftUI状态更新

更改正在进行的异步任务的完成(SWIFT并发)(&q;)?

并发访问SWIFT中数组的非重叠子范围

我可以为UIMenu设定一个固定的订单吗?

解码器是否需要具有密钥的外部数据表示?

Swiftui 无法从核心数据中获取数据

如何让飞机与 RealityKit 中的物体相撞

在 struct 中的序列和非序列泛型函数之间进行 Select

无法使用 RealityKit 播放 USDZ 动画

Swift-SceneKit-无法从art.scnassets加载.scn文件

如何确定扩展中的具体类型?

在 SwiftUI 中操作绑定变量

是否可以使任何协议符合 Codable?

如何在 Swift 中的两个 UIView 中心之间添加线?

Swift:在子类中覆盖 == 导致仅在超类中调用 ==

否定 #available 语句

Swift 中的 PageViewController 当前页面索引

swift中相同的数据类型多变量声明