首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Erlang lists:index_of函数?

Erlang lists:index_of函数?
EN

Stack Overflow用户
提问于 2009-09-22 17:56:41
回答 6查看 15.7K关注 0票数 18

我正在寻找一个Erlang库函数,它将返回列表中特定元素的索引。

所以,如果

代码语言:javascript
复制
X = [10,30,50,70]
代码语言:javascript
复制
lists:index_of(30, X)

将返回1,等等,就像java.util.ListindexOf()方法一样。

Erlang标准库中是否存在这样的方法?我试着在列表模块中查找,但没有成功。或者我应该自己写?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-09-22 10:10:48

您必须自己定义它,如下所示:

代码语言:javascript
复制
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),因此经常通过索引访问列表的算法的效率将低于按顺序迭代列表的算法。

票数 22
EN

Stack Overflow用户

发布于 2011-07-20 20:50:55

正如其他人所指出的,有更有效的方法来解决这个问题。但是如果你正在寻找一些快速的东西,这对我来说很有效:

代码语言:javascript
复制
string:str(List, [Element]).
票数 15
EN

Stack Overflow用户

发布于 2010-11-10 10:34:27

其他解决方案(请注意,这些是base-index=1):

代码语言:javascript
复制
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()等。如果你的列表非常大,一个不那么简单的解决方案可能是最好的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1459152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档