Как найти минимальный ненулевой INT в массиве в Swift 5.0? - PullRequest
4 голосов
/ 25 апреля 2019

У меня есть некоторый массив, и мне нужно найти минимальное ненулевое целое число в каждой строке.Есть ли способ сделать это с помощью min (by:)?

, например,

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

, поэтому мне нужно получить 1

, выполнив row.min() Iвсегда получаю 0.

Мне сказали, что я могу сделать это с min{by:}, но я не до конца понимаю синтаксис.

Ответы [ 4 ]

8 голосов
/ 25 апреля 2019

Вы можете отфильтровать массив по требуемым значениям и использовать метод Array.min(), например:

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

Или следующее только будет работать, если массив имеет упорядоченные числа

row.first(where: { $0 > 0 })
6 голосов
/ 25 апреля 2019

Просто отфильтруйте массив, чтобы все элементы были больше 0, и найдите среди них min.

Используйте операцию lazy для предотвращения выделения промежуточного массива, обычно вызванного Array.filter(_:). Подробнее см. https://stackoverflow.com/a/51917427/1630618.

let minNonZeroValue = row.lazy.filter { 0 < $0 }.min()
3 голосов
/ 25 апреля 2019

Вы можете сделать это так:

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

Обратите внимание, что result является необязательным Int, поскольку result может не содержать элементов, соответствующих условию.

2 голосов
/ 25 апреля 2019

Очевидно, что существует много способов, один из которых (который не создает промежуточный массив или не требует сортировки 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 }

Результат является необязательным, поскольку не может быть никаких ненулевых элементов.

edit : min(by:) Решение также может действительно использоваться, но оно также несколько нечитаемо и возвращает 0 в случае отсутствия ненулевых элементов (вместо nil):

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