我正在寻找一个Erlang库函数,它将返回列表中特定元素的索引。
所以,如果
X = [10,30,50,70]
lists:index_of(30, X)
将返回1,等等,就像java.util.List
的indexOf()
方法一样。
Erlang标准库中是否存在这样的方法?我试着在列表模块中查找,但没有成功。或者我应该自己写?
发布于 2009-09-22 10:10:48
您必须自己定义它,如下所示:
index_of(Item, List) -> index_of(Item, List, 1).
index_of(_, [], _) -> not_found;
index_of(Item, [Item|_], Index) -> Index;
index_of(Item, [_|Tl], Index) -> index_of(Item, Tl, Index+1).
但是请注意,访问列表的第N个元素是O(N),因此经常通过索引访问列表的算法的效率将低于按顺序迭代列表的算法。
发布于 2011-07-20 20:50:55
正如其他人所指出的,有更有效的方法来解决这个问题。但是如果你正在寻找一些快速的东西,这对我来说很有效:
string:str(List, [Element]).
发布于 2010-11-10 10:34:27
其他解决方案(请注意,这些是base-index=1):
index_of(Value, List) ->
Map = lists:zip(List, lists:seq(1, length(List))),
case lists:keyfind(Value, 1, Map) of
{Value, Index} -> Index;
false -> notfound
end.
index_of(Value, List) ->
Map = lists:zip(List, lists:seq(1, length(List))),
case dict:find(Value, dict:from_list(Map)) of
{ok, Index} -> Index;
error -> notfound
end.
在某些情况下,当传递给这些函数的列表变得足够长时,构造额外列表或字典的开销就会变得过于昂贵。如果您可以通过在这些函数之外保留该格式的列表来避免每次要搜索列表时都进行构造,那么您就消除了大部分开销。
使用字典将对列表中的值进行散列处理,并有助于将索引查找时间减少到O(log N),因此最好将其用于大型单键列表。
一般而言,将数据组织成适合您如何使用它们的结构取决于您作为程序员。我的猜测是,没有内置的index_of是为了鼓励这样的考虑。如果要进行单键查找-- index_of()就是这样--请使用字典。如果您正在进行多键查找,请使用带有列表的元组列表:keyfind()等。如果你的列表非常大,一个不那么简单的解决方案可能是最好的。
https://stackoverflow.com/questions/1459152
复制相似问题