代码之家  ›  专栏  ›  技术社区  ›  Duck

第一个索引:属于:在对象数组中

  •  0
  • Duck  · 技术社区  · 5 年前

    我有这门课:

    class ValueTimestamp {
      let value: Double
      let timestamp : Double
      init(value:Double, timestamp:Double) {
        self.value = value
        self.timestamp = timestamp
      }
    }
    

    然后我有一个这个类的对象数组。

    现在我想扫描这个数组并找到 ValueTimestamp 用最小值初始化。

    假设数组有3个元素

    1. element1 (值=12,时间戳=2)
    2. element2 (值=5,时间戳=3)
    3. element3 (值=10,时间戳=4)

    let myArray = [element1, element2, element3]
    

    现在我想找到具有最小值的元素。

    我想这个可以用

    let min = myArray.map({$0.value}).min()
    let minIndex = myArray.firstIndex(of: min)
    

    但是第二行给了我这个错误

    调用中的参数标签不正确(具有“of:”,应为“where:”)

    有什么想法吗?

    2 回复  |  直到 5 年前
        1
  •  2
  •   emrepun    5 年前

    firstIndex(of: ) 因为我认为你们班不符合 Equatable .

    这就是为什么你要用它 firstIndex(where:) 对于这种情况。

    同样,在下面的代码中,您没有得到对象,而是得到了值,所以 min 是类型 Double? ValueTimeStamp? :

    let min = myArray.map({$0.value}).min()
    

    您可以通过使用where获得具有以下内容的min索引:

    let minIndex = myArray.firstIndex(where: {$0.value == min})
    

    参考文献:

    https://developer.apple.com/documentation/swift/array/2994720-firstindex https://developer.apple.com/documentation/swift/array/2994722-firstindex

        2
  •  4
  •   John Montgomery    5 年前

    firstIndex:of: 查找第一个元素 等于 提供的参数。但你不是在寻找一个等于它的元素,而是在寻找一个 value 属性相等。所以你需要使用 where 并为此提供一个函数:

    let minIndex = myArray.firstIndex(where: {$0.value == min})
    

    你也可以使你的班级符合 Comparable 然后打电话 min 直接说:

    class ValueTimestamp: Comparable {
      let value: Double
      let timestamp : Double
      init(value:Double, timestamp:Double) {
        self.value = value
        self.timestamp = timestamp
      }
    
      static func == (lhs: ValueTimestamp, rhs: ValueTimestamp) -> Bool {
        return lhs.value == rhs.value
      }
      static func < (lhs: ValueTimestamp, rhs: ValueTimestamp) -> Bool {
        return lhs.value < rhs.value
      }
    }
    
    let minObject = myArray.min()
    

    请注意,如果有可能有两个相同的对象 价值 ,在这种情况下,您可能需要调整函数以确定哪个函数“更少”。

        3
  •  1
  •   Alexander    5 年前

    根本原因是 firstIndex(of:_) 仅在上定义 Collection where Element: Equatable . 你的类型是不相等的,所以这个方法对你来说是不可用的,除非你使它符合。

    但是,只需使用 Array.min(by:_) :

     let timestampedValues = [element1, element2, element3]
     let minTimestampedValue = timestampedValues.min(by: { $0.value })