你如何使用foldl找出一个字母在字符串中重复的次数?

时间:2017-02-25 15:33:48

标签: string testing erlang anonymous-function fold

我是Erlang的新手,正在测试不同的功能以掌握它们。我希望这个函数能够返回一个整数,该整数表示使用foldl函数在字符串中重复字母变量的次数,但是在决定“fun”函数时有点困难。有什么帮助吗?

我希望函数返回的示例:

`test:count("Hello this is a test", $i)`

应该返回2

test:count("Hello this is a test", $t)

应该返回3

-spec count(String, Char) -> integer() when
  String::string(),
  Char::char().

count(String, Char) ->

F = ???,

lists:foldl(F, 0, String).

4 个答案:

答案 0 :(得分:1)

根据Hynek -Pichi- Vychodil的回答,你也可以写下这样的折叠:

count(String, Char) ->
  F = fun(C, Count) when C=:=Char-> Count + 1;
         (_, Count)              -> Count
      end,
  lists:foldl(F, 0, String).

答案 1 :(得分:0)

F = fun(C, Acc) ->
    %% Fill this in yourself ;)
end,

请记住,函数F中返回的值是下一次迭代中累加器Acc的值。在最后一次迭代中,累加器Acc的当前值将由lists:foldl/3返回。

在您的代码中,第一个迭代的Acc值将为0,因为您输入了lists:foldl/3的第二个参数。你正走在正确的轨道上。

您的函数只需要比较当前字符C是否等同于Char。如果是,请递增Acc并将其返回。否则,请不要递增Acc并返回相同的变量。

希望这有帮助!

答案 2 :(得分:0)

字符串中特定字符的出现长度也是一样的。

count(String, Char) ->                                                                                                                                                               
    Occurrences = [ X || X <- String, X == Char],                                                                                                                                            
    length(Occurrences). 

答案 3 :(得分:0)

我根本不会使用lists:foldl/3

count(String, Char) ->
    count(Char, String, 0).

count(_, [], Count) -> Count;
count(C, [H|T], Count) ->
    count(C, T, if C =:= H -> Count+1; true -> Count end).

或更常见的是

count(_, [],    Count) -> Count;
count(C, [C|T], Count) -> count(C, T, Count+1);
count(C, [_|T], Count) -> count(C, T, Count).

但如果你坚持

count(String, Char) ->
    F = fun(C, Count) ->
            if C =:= Char -> Count + 1;
               true       -> Count
            end
         end,
    lists:foldl(F, 0, String).