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:在元组中搜索字符串而不转换为列表和字符串标记的主要内容,如果未能解决你的问题,请参考以下文章

在元组中打印元素,不带逗号,引号和括号

Python:在元组中存储许多正则表达式匹配?

Python基础-04元组

Python基础-04元组

在python中,我应该如何在元组列表上实现最小堆?

python基础知识第四篇(元组)