Erlang:在元组中搜索字符串而不转换为列表和字符串标记
Posted
技术标签:
【中文标题】Erlang:在元组中搜索字符串而不转换为列表和字符串标记【英文标题】:Erlang: search string in an tuple without converting into lists and string tokens 【发布时间】: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 使这项任务更容易?
【问题讨论】:
顺便说一句:你知道元组是一种“稀缺”资源,对吧?通过拥有像这样的(组合)元组,您可能有耗尽元组空间的危险。考虑不同的表示? 【参考方案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>
【讨论】:
以上是关于Erlang:在元组中搜索字符串而不转换为列表和字符串标记的主要内容,如果未能解决你的问题,请参考以下文章