在列表中搜索具有特定字段的记录并忽略其余字段

时间:2012-02-07 09:13:06

标签: erlang

我的记录定义为:

1> rd(fact, {a,b,c}).
fact

我创建了三条记录并将它们放在一个列表中

2> F1 = #fact{a=1,b=1,c=1}.
#fact{a = 1,b = 1,c = 1}
(3> F2 = #fact{a=2,b=2,c=2}.
#fact{a = 2,b = 2,c = 2}
3> F3 = #fact{a=3,b=3,c=3}.
#fact{a = 3,b = 3,c = 3}
4> L = [F1,F2,F3].
[#fact{a = 1,b = 1,c = 1},
 #fact{a = 2,b = 2,c = 2},
 #fact{a = 3,b = 3,c = 3}]

现在,我想检查列表是否包含“a”为1且我不关心其余字段的记录

(dilbert@Martin-PC)21> lists:member(#fact{a=1}, L).
false
(dilbert@Martin-PC)23> lists:member(#fact{a=1,b=1,c=1}, L).
true

我怎样才能完成它?

3 个答案:

答案 0 :(得分:7)

或者您可以使用keyfind。

lists:keyfind(1, #fact.a, L).

答案 1 :(得分:3)

记录是纯粹的语法糖。如果未在记录声明中指定其他字段的值,则使用原子'undefined'。因此,您的搜索适用于:

#fact{a=1, b='undefined', c='undefined'}

......当然不存在。

请改为尝试:

lists:any(fun(#fact{a=A}) -> A =:= 1 end, L).

答案 2 :(得分:3)

或列表理解:

OneList = [E || E <- L, E#fact.a =:= 1]