Erlang - 根据第一个值删除重复元组

时间:2015-12-04 03:56:26

标签: list erlang tuples

我正在尝试创建一个函数,该函数将查看元组列表并删除具有相同第一元素的元素。例如:

rmvSameTpl([{2,1}, {2,1}, {3,1}, {2,1}]).

应该返回[{2,1},{3,1}]。

问题是我的功能总是只返回第一个元组,因为我是初学者,我无法弄清楚为什么会这样?

-export([rmvSameTpl/1]).

rmvSameTpl ([])-> [];
rmvSameTpl ([Z])-> [Z];
rmvSameTpl ( [H|T] ) -> 
    [H| [L || L<-rmvSameTpl(T), (element(1, H)) /= (element(1, T))] ].

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

您的方法具有O(N ^ 2)时间复杂度。有明显简单的O(N * logN)解决方案:

1> lists:ukeysort(1, [{2,1}, {2,1}, {3,1}, {2,1}]).
[{2,1},{3,1}]

答案 1 :(得分:0)

您在最后一种情况下进行了错误的比较:(element(1, H)) /= (element(1, T))而不是(element(1, H)) /= (element(1, L))。它失败并出现异常,因为T是列表而不是元组。但在Erlang列表推导中,失败的过滤器被视为false,因此[L || L<-rmvSameTpl(T), (element(1, H)) /= (element(1, T))]最终成为空列表。

答案 2 :(得分:0)

你刚刚犯了一个错字,你使用元素(1,T)而不是元素(1,L)。使用

[H| [L || L<-rmvSameTpl(T), (element(1, H)) /= (element(1, L))] ].

您的代码可以运行,但如果您使用大型列表,我对性能和堆栈大小不满意。