Как хранить целые числа в списке - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь разделить массив целых чисел, чтобы подсчитать, сколько там повторяющихся чисел.

Для этого ввода [10, 20, 20, 10, 10, 30, 50, 10, 20] Я получаю следующий результат:

#{10=>"\n\n\n\n",20=>[20,20],30=>[30],50=>"2"}

Вопрос

Я хотел бы знать, как я могу сгенерировать следующий вывод

#{10=>[10,10,10,10],20=>[20,20],30=>[30],50=>[50]}

Функция, которую я использую для генерации вывода карты:


%% Next: number
%% Acc: map
separate_socks(Next, Acc) ->
    KeyExists = maps:is_key(Next, Acc),

    case KeyExists of
        true ->
            CurrentKeyList = maps:get(Next, Acc),
            maps:update(Next, [Next | CurrentKeyList], Acc);
        false -> maps:put(Next, [Next], Acc)
    end.

Ответы [ 3 ]

1 голос
/ 12 июля 2020

Вы можете использовать shell:strings/1 функцию , чтобы решить проблему отображения чисел как символов. Когда вызывается shell:strings(true), числа будут напечатаны как символы:

1> shell:strings(true).
true
2> [10,10,10].
"\n\n\n"

Вызов shell:strings(false) приведет к тому, что числа будут напечатаны как числа:

3> shell:strings(false).
true
4> [10,10,10].
[10,10,10]
1 голос
/ 13 июля 2020

Вы также можете отформатировать вывод с помощью io: format () :

1> M = #{10=>[10,10,10,10],20=>[20,20],30=>[30],50=>[50]}.
#{10 => "\n\n\n\n",20 => [20,20],30 => [30],50 => "2"}

2> io:format("~w~n", [M]).
#{10=>[10,10,10,10],20=>[20,20],30=>[30],50=>[50]}
ok

w

Записывает данные с стандартный синтаксис. Используется для вывода терминов Erlang.

1 голос
/ 12 июля 2020

Ваш вывод действительно правильный. Значение ascii для \n равно 10. В erlang нет собственного типа данных string. Строка - это ничто по списку значений. erlang:is_list("abc") вернет true.

Попробуйте ввести [1010, 1020, 1020, 1010, 1010, 1030, 1050, 1010, 1020]. Он должен отображать все числа.

...