others - swift 5.0中求数组中最小非零整数的方法?

  显示原文与译文双语对照的内容
145 4

我有一些数组,我需要找出每行的最小非零整数。有没有办法用min(by :)做到这一点?

例如

var row = [0,0,0,0,0,0,0,0,1,3,5,6,9]

所以我需要得到 1

通过执行 row.min( ),我总是得到 0.

我听说我可以用 min{by:} 做它,但是我不完全理解语法。

时间:原作者:0个回答

50 3

你可以根据需要过滤数组,并使用 Array.min() 方法,如下所示

row.filter{ $0> 0 }.min()

或以下仅在数组具有已排序的数字时才有效

row.first(where: { $0> 0 })
原作者:
53 3

过滤数组以保持所有元素大于 0,并在这些元素之间找到 min

使用 lazy 操作来防止中间数组分配通常由 Array.filter(_:) 引起。有关详细信息,请参阅 https://stackoverflow.com/a/51917427/1630618

let minNonZeroValue = row.lazy.filter { 0 <$0 }.min()
原作者:
138 2

你可以这样做:

let result = row.lazy.filter { $0> 0 }.min()

注意,result 是可选的Int,因为 result 可能不包含任何与条件匹配的元素。

原作者:
131 4

显然有很多方法,(它不创建中间数组,或要求对 row 进行排序)的一种方式是使用 reduce:

row.reduce(nil as Int?) { minSoFar, this in
 guard this!= 0 else { return minSoFar }
 guard let minSoFar = minSoFar else { return this }
 return min(minSoFar, this)
}

这等同于,但更可读,更短:

row.reduce(nil as Int?) { $1!= 0? min($0?? $1, $1) : $0 }

由于可能没有任何非零元素,所以结果是可选的。

编辑:min(by:) 解决方案也可以使用,但也有些不可读,在没有非零元素( 而不是 nil )的情况下返回 0:

row.min { $0 == 0? false : ($1 == 0? true : $0 <$1) }
原作者:
...