Swift - умный способ циклически перемещаться по массиву массивов [[Int]]

Я использую Array of Array [[Int]] для хранения координат на карте. Я, например, хочу заменить все "2" на "1". Для этого я создал 2 цикла for, которые определяют пространство массива и проверяют содержимое. Это не очень гибко и работает только с массивами определенного размера.

private func remove2fromArray(currentArray: [[Int]]) -> [[Int]] {

    var newArray : [[Int]] = currentArray

    for section in 0...14 {
        for row in 0...19 {
            if newArray[section][row] == 2
            { newArray[section][row] = 1 }
        }
    }
    return newArray
}

Есть ли способ просто просмотреть содержимое массива, чтобы заменить числа?

например currentArray.findAndReplace(find:2, replace: 1) или аналогичный, который работает с [[Int]]?

По крайней мере, удалите эти жестко запрограммированные диапазоны. Базируйте циклы на фактических размерах массивов.

rmaddy 07.04.2019 20:32

Почему вы используете 2d-массив для хранения координат? При чем тут модель? Не лучше ли было бы иметь структуру Coordinate и просто хранить их плоский массив?

Fogmeister 07.04.2019 20:33

Массив — это «упорядоченная коллекция с произвольным доступом». Это не похоже на Координат для меня. Вам лучше создать тип данных, который лучше подходит для координаты.

Alexander 07.04.2019 22:29

Ну, это прекрасно работает, потому что я могу получить доступ к массиву [разделу] [строке], который определяет, на мой взгляд, двумерное пространство — координаты. Вы имеете в виду что-то вроде: struct {x:Int;y:Int;value:Int}? - на мой взгляд, это будет труднее накормить.

Nathanael Tse 08.04.2019 23:13

И было бы полезно, если бы вы могли объяснить, как заменить диапазоны закодированных карт, потому что я не мог использовать count для массива в массиве. Но я мог бы сделать это с помощью функции карты ниже.

Nathanael Tse 08.04.2019 23:21
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
2
5
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сделать это следующим образом:

let result = array.map { subarray in
    subarray.map { integer -> Int in
        if integer == 2 {
            return 1
        } else {
            return integer
        }
    }
}

Еще короче:

let result = array.map {
    $0.map { integer in
        return integer == 2 ? 1 : integer
    }
}

И однострочный:

let result = array.map { $0.map { $0 == 2 ? 1 : $0 } }

Я попытаюсь объяснить, что здесь происходит, простыми словами: карта делает то, что она проходит через элементы массива один за другим и применяет функцию к элементу.

В нашем примере первая карта перебирает элементы внешнего массива, поэтому $0 здесь относится к внутренним массивам (по одному).

Вторая карта перебирает элементы внутренних массивов. Итак, $0 во внутренней карте относится к каждому элементу элементов внутреннего массива.

работает как шарм. Думаю, мне придется прочитать руководство, что на самом деле делает .map, или вы могли бы объяснить отдельные параметры? map возвращает массив, индивидуальное содержимое которого представлено $0 и изменено последующими функциями. где я могу узнать о коротких функциях с "?" а также ":"? Это кажется таким худым.

Nathanael Tse 07.04.2019 21:56

Я обновил свой ответ, чтобы объяснить, что происходит. Если вам нужно больше объяснений, пожалуйста, дайте мне знать.

Mo Abdul-Hameed 07.04.2019 22:03

Идеально. Большое спасибо!

Nathanael Tse 08.04.2019 23:08

Другие вопросы по теме