从列表中的元组中提取匹配元素

时间:2016-03-29 02:53:27

标签: list erlang tuples matching

标题说明了这一切所以我基本上将一个列表传递给我的函数让我们说, L = [{" Socrates"," fork1,fork2"},{"孔子"," fork2,fork3"},{&# 34; Aristole"," fork3,fork4"},{" Homer"," fork4,fork5"},{" Plato" " fork5,与fork1"}]

我传递要匹配的值和此列表,但是当我找到匹配值时,我想仅传递列表的第二个元素,例如,如果我通过"苏格拉底"我应该回来" fork1,fork2"

这是我的两个功能

whichFork({Name},[X|Xs])  ->
 Fork  = element(2,X),%get forks 
 Phil  = element(1,X),%get phil name
 Check = are_the_same(Phil,Name),%find out if they match 
  case Check of
    true-> Fork;%return forks in string
    false->whichFork(Name,Xs)%false repeat iterating the list
  end;
whichFork(_,[]) ->  %not found
false.

are_the_same(A,B) when A=:=B ->
  true;
are_the_same(_,_) ->
  false.

我在网站上搜索过,没有这样的问题存在,所以任何帮助都非常感激

2 个答案:

答案 0 :(得分:1)

您可以使用proplists:get_value。 这是文档: http://erlang.org/doc/man/proplists.html#get_value-2

1> L = [{"Socrates", "fork1,fork2"},{"Confucius","fork2,fork3"},{"Aristole", "fork3,fork4"}, {"Homer","fork4,fork5"},{"Plato","fork5,fork1"}].
4> proplists:get_value("Socrates", L).
"fork1,fork2"

如果你想要总元素,也许你可以使用http://erlang.org/doc/man/lists.html#keyfind-3

答案 1 :(得分:1)

BlackMamba已经给你一个答案,但我对你的代码有2条评论。

首先关于错误管理,在哲学家问题中,你没有机会(除了你的代码中的错误)你正在寻找一个不存在的名字,因此案例whichFork(_,[]) -> false.是没用的只是延迟代码崩溃的时刻。

其次是模式匹配的使用:你可以这样编写代码are_the_same(A,B) when A=:=B -> ... are_the_same(A,A) -> ...它给出相同的结果,你可以将它扩展到wichFork函数:

whichFork(Name,[{Name,Forks}|Xs])  -> Forks;
whichFork(Name,[_|Xs])  -> whichFork(Name,Xs).