【问题标题】:How to find max/min value in array of struct如何在结构数组中找到最大值/最小值
【发布时间】:2021-03-15 16:48:38
【问题描述】:

我将数据集结构定义为

struct Dataset: Hashable {
    var x: Double
    var y: Double
}

然后是数组

var dataset: [Dataset]

array 充满了值,我需要找到 x 和 y 结构变量的最大值。是使用

 let maxXValue = dataset.max(by: (Dataset, Dataset) throws -> Bool)

正确的方法以及它应该是什么样子?

【问题讨论】:

  • 什么是 sin 数组?
  • @matt 可能的意思是“在数组中”
  • Matt,显然这是一个给定开发人员犯下的一系列错误行为。 :)
  • 是的,“在数组中”是错字
  • 找到“x 和 y 的最大值”是什么意思。您是否要查找具有最大 x 和 y 值的单个记录?如果一条记录具有最大 x 值而另一条记录具有最大 y 值怎么办?您必须先定义一个编程问题,然后才能弄清楚如何实现解决方案。

标签: arrays swift struct


【解决方案1】:

max(by:) 函数将返回序列中最大的元素,使用传递的闭包作为元素之间的比较。

因此,您的代码将如下所示:

let maxXValue = dataset.max { $0.x < $1.x }?.x
let maxYValue = dataset.max { $0.y < $1.y }?.y

【讨论】:

    【解决方案2】:

    如果你想获得两个单独的变量,你可以使用mapmax

    let maxX = dataset.map(\.x).max()
    let maxY = dataset.map(\.y).max()
    

    这将为您提供使用 reducemax 的最大 x 和 y 值的元组

    let maxValues: (x: Double, y: Double)
    if dataset.isEmpty {
        maxValues = (0, 0)
    } else {
        maxValues = dataset
            .dropFirst()
            .reduce((dataset.first!.x, dataset.first!.y)) { (max($0.0, $1.x), max($0.1, $1.y)) }
    }
    

    【讨论】:

      【解决方案3】:

      我会尝试用一个例子更详细地解释

      struct Dataset: Hashable {
          var x: Double
          var y: Double
      }
      
      let data1 = Dataset(x: 0.4, y: 0.2)
      let data2 = Dataset(x: 0.3, y: 0.1)
      let data3 = Dataset(x: 0.1, y: 0.6)
      
      let dataArray = [data1, data2, data3]
      
      let maxX = dataArray.max { (firstElement, secondElement) -> Bool in
          return firstElement.x < secondElement.x
      }
      let maxY = dataArray.max { (firstElement, secondElement) -> Bool in
          return firstElement.y < secondElement.y
      }
      
      print("Maximum X", maxX)
      print("Maximum Y", maxY)
      

      【讨论】:

        【解决方案4】:

        您可以扩展 Sequence 并实现自定义 max 和 min 方法,以允许您指定符合 Comparable 的属性的 keypath:

        extension Sequence {
            func max<T: Comparable>(_ predicate: (Element) -> T)  -> Element? {
                self.max(by: { predicate($0) < predicate($1) })
            }
            func min<T: Comparable>(_ predicate: (Element) -> T)  -> Element? {
                self.min(by: { predicate($0) < predicate($1) })
            }
        }
        

        let points: [CGPoint] = [.init(x: 1.2, y: 3.4),
                                 .init(x: 0.1, y: 2.2),
                                 .init(x: 2.3, y: 1.1)]
        

        let maxX = points.max(\.x)
        let maxY = points.max(\.y)
        print("maxX:", maxX ?? "nil")
        print("maxY:", maxY ?? "nil")
        

        let minX = points.min(\.x)
        let minY = points.min(\.y)
        print("minX:", minX ?? "nil")
        print("minY:", minY ?? "nil")
        

        这将打印出来

        maxX: (2.3, 1.1)
        最大值:(1.2, 3.4)
        minX: (0.1, 2.2)
        minY: (2.3, 1.1)

        【讨论】:

          猜你喜欢
          • 2016-01-31
          • 2018-01-08
          • 2021-02-10
          • 1970-01-01
          • 1970-01-01
          • 2018-07-04
          • 1970-01-01
          • 1970-01-01
          • 2014-10-23
          相关资源
          最近更新 更多