Как рассчитать количество элементов в зубчатом массиве в F #? - PullRequest
0 голосов
/ 15 июня 2019

Я новичок в F # и нигде не нашел ответа на этот вопрос. Я создаю зубчатый массив, который может содержать 10 строк и 10 столбцов с увеличивающимся числом элементов. Код, который я использовал для создания и печати массива, выглядит следующим образом:

    let jagged = [| for a in 1 .. 10 do yield [| for a in 1 .. a do yield 0 |] |]
    let mutable len = 0;

    for arr in jagged do
        for col in arr do
            len <- (len + 1)
            printf "%i " col
        printfn "";

    printfn "%i" len

Приведенный выше код дает следующий вывод

0
0 0
0 0 0
0 0 0 0
0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
55

В настоящее время я рассчитываю количество элементов вручную, но хотел бы знать, есть ли лучший способ сделать это.

1 Ответ

4 голосов
/ 15 июня 2019

Если вы хотите рассчитать длину одного массива, вы можете использовать Array.length.Но у вас есть массив массивов разной длины, и вы хотите вычислить сумму их размеров.Вместо того, чтобы просто дать вам ответ, я покажу вам, как вы можете использовать https://fsharpforfunandprofit.com/posts/list-module-functions/ (сайт Скотта Влашина, это действительно потрясающий ресурс, кстати), чтобы найти ответ самостоятельно.На этой странице представлен ряд вопросов, которые помогут вам найти нужные функции: начиная с вопроса 1, вы переходите к другим вопросам и, в конечном итоге, к списку полезных функций.

Вопрос 1 на этой странице"Какая у вас коллекция?"Варианты: «У меня нет коллекции, и я хочу ее создать», или «У меня есть одна коллекция, с которой я хочу работать», или несколько других вариантов, когда у вас есть две, три или более коллекций.Здесь у нас есть одна коллекция, с которой мы хотим работать, поэтому страница направляет нас к вопросу 9.

В вопросе 9 на этой странице есть несколько вариантов, которые я здесь не буду повторять, но один из них "Если вы хотите объединить или обобщить коллекцию в одно значение ".Это похоже на то, что мы хотим: мы хотим получить сумму длин подмассивов.Итак, мы переходим к разделу 14, в котором есть множество функций, которые мы можем использовать.И на полпути вниз по списку sum и sumBy.Это звучит интригующе.Функция sum «возвращает сумму элементов в коллекции» ... ну, нет, это не сработает, потому что наш массив содержит массивы, а не числа.Но функция sumBy «возвращает сумму результатов, сгенерированных путем применения функции к каждому элементу коллекции».И мы знаем, что есть функция для определения длины одного массива: Array.length.(На странице говорится о функциях, которые работают со списками, но практически любая функция, которая работает со списками, имеет соответствующую функцию, которая работает с массивами, и аналогичную функцию, которая работает с последовательностями. Несколько исключений относятся к таким вещам, как, например, бесконечноепоследовательности, но не бесконечные массивы или списки, поэтому есть функция Seq.initInfinite, но нет функции Array.initInfinite или List.initInfinite).

Итак, теперь, когда мы нашли это, нам просто нужно написать это.

let lengthOfJaggedArray arr = arr |> Array.sumBy Array.length

И все.Вместо того, чтобы вычислять длину вручную с помощью двух вложенных циклов for, есть однострочное решение, которое довольно просто и использует встроенные функции.Все, что вам нужно было сделать, это знать, какие функции доступны - и поскольку весь список доступных функций array / list / seq может быть немного пугающим, когда вы новичок в F #, Скотт Влашин сделал очень полезный ресурс, чтобы помочь сделать егонемного менее пугающим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...