【问题标题】:Erlang: search string in an tuple without converting into lists and string tokensErlang:在元组中搜索字符串而不转换为列表和字符串标记
【发布时间】:2018-08-25 14:32:52
【问题描述】:

我有一个元组为 {'Europe-Fiat-Italy-Warehouse'}。 汽车 = {'Europe-Fiat-Italy-Warehouse'}。

我想在上面的元组中搜索字符串“Fiat”而不将它们转换为列表中的字符串标记。 即,

(madmax@erlang)46>string:tokens(atom_to_list(element(1, Car)), "-").
["Europe","Fiat","Italy","Warehouse"]
(madmax@erlang)46> ["Europe", "Fiat" | Other] = 
string:tokens(atom_to_list(element(1, Car)), "-").
["Europe","Fiat","Italy","Warehouse"]
(madmax@erlang)47>
(madmax@erlang)47> Other.
["Italy","Warehouse"]
(madmax@erlang)48>

如上所述,我们将元组转换为原子,然后将原子转换为列表,然后将列表转换为字符串标记。有没有优化的方法?或任何 erlang 中可用的 Buit-in-Function 使这项任务更容易?

【问题讨论】:

  • 顺便说一句:你知道元组是一种“稀缺”资源,对吧?通过拥有像这样的(组合)元组,您可能有耗尽元组空间的危险。考虑不同的表示?

标签: list erlang tuples


【解决方案1】:

使用string:str

在此处查看文档:http://erlang.org/doc/man/string.html#str-2

返回子字符串的位置,如果没有找到子字符串则返回零。

string:str(atom_to_list(element(1, Car)), "Fiat")

【讨论】:

    【解决方案2】:

    内存中原子的表示不是使用字符串(或列表),要在原子名称中搜索,除了首先将其转换为列表之外别无选择。可以使用诸如 string:str/2 之类的库函数,但您可能会得到不好的结果,因为您搜索的字符串可能是较长字符串的一部分,因此您应该保留对 string:token/2 的调用,然后它取决于你想做什么:

    1> Car = {'Europe-Fiat-Italy-Warehouse'}.
    {'Europe-Fiat-Italy-Warehouse'}
    2> Words = string:tokens(atom_to_list(element(1, Car)), "-").
    ["Europe","Fiat","Italy","Warehouse"]
    3> lists:member("Fiat",Words). % only a test
    true
    4> lists:dropwhile(fun(X) -> "Fiat" =/= X end ,Words). % words after
    ["Fiat","Italy","Warehouse"]
    5> lists:takewhile(fun(X) -> "Fiat" =/= X end ,Words). % words before
    ["Europe"]
    6>  lists:member("Fit",Words). % same thing with a bad match
    false
    7> lists:dropwhile(fun(X) -> "Fit" =/= X end ,Words). 
    []
    8> lists:takewhile(fun(X) -> "Fit" =/= X end ,Words). 
    ["Europe","Fiat","Italy","Warehouse"]
    9>
    

    【讨论】:

      猜你喜欢
      • 2015-04-20
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多