【问题标题】:Erlang filter list using lists:keyfind partial stringErlang过滤列表使用列表:keyfind部分字符串
【发布时间】:2015-09-21 19:16:27
【问题描述】:

Erlang我几乎是新手

我有一个列表:

List = [[{name, <<"redCar1">>}, {turbo, true}], [{name, <<"redCar2">>}, {turbo, true}], [{name, <<"greenCard">>}, {turbo, false}]].

现在我想过滤所有"red"汽车

我尝试使用:

filterCar() ->
  MyF = fun(List) ->
    case lists:keyfind(name, 1, List) of
      {name, <<"red", _Rest/binary>>} ->
        true:
      _ ->
        false
    end
  end,
  MyF.

然后

lists:filter(MyF, List),

效果很好。

现在我想创建一个通用函数来过滤,比如:

myfilter(Value, List) ->
  case lists:keyfind(name, 1, List) of
    {name, <<Value, _Rest/binary>>} ->
      true;
    _ ->
      false
  end.

但是当我尝试执行这个函数时,我总是得到[] 空列表。

我确定问题出在我尝试传递 Value 时,因为如果我替换

 {name, <<Value, _Rest/binary>>}

{name, <<"red", _Rest/binary>>}

有效。

我的目标是在忽略大小写的情况下找到所有以car 开头的字符串。

【问题讨论】:

    标签: erlang


    【解决方案1】:

    您只需要指出另外两件事即可在二进制文件中使用通用值:它是二进制文件,以及该二进制文件的大小。

    filterCar(Value) when is_binary(Value) ->
        MyF = fun(List) ->
                      Size = byte_size(Value),
                      case lists:keyfind(name, 1, List) of
                          {name, <<Value:Size/binary, _Rest/binary>>} ->
                              true;
                          _ ->
                              false
                      end
              end,
        MyF.
    

    首先我们将filterGuard 更改为一个参数Value,这是我们要查找的模式。我们在函数上使用保护以确保 Value 是二进制文件。在内部fun 内部,我们首先通过byte_size/1 检索Value 的大小,这是我们需要的,以便我们可以在匹配的二进制文件中设置预期的字段大小。这导致了关键的变化,即&lt;&lt;Value:Size/binary, _Rest/binary&gt;&gt;:我们设置了Value字段的预期大小,我们将其定义为binary字段。

    有了这个变化,我们可以成功地将它应用到您的List 变量,将&lt;&lt;"red"&gt;&gt; 传递给Value

    1> lists:filter(filterCar(<<"red">>), List).
    [[{name,<<"redCar1">>},{turbo,true}],
     [{name,<<"redCar2">>},{turbo,true}]]
    

    【讨论】:

    • 谢谢。有用。但是假设列表是这样的{name, "redCar1"}。是一样的吗?我正在尝试不使用二进制&lt;&lt;&gt;&gt;,但没有成功。
    • 如果您还希望能够将字符串作为键传递,请将最后一行从 MyF. 更改为 MyF; 然后添加另一个函数子句:filterCar(Value) when is_list(Value) -&gt; filterCar(list_to_binary(Value)).
    猜你喜欢
    • 2017-05-10
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 2011-03-04
    相关资源
    最近更新 更多