我正在尝试创建一个函数,该函数将查看元组列表并删除具有相同第一元素的元素。例如:
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))] ].
任何帮助将不胜感激。
答案 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))] ].
您的代码可以运行,但如果您使用大型列表,我对性能和堆栈大小不满意。