【问题标题】:Erlang - Removing repeating tuples according to first valueErlang - 根据第一个值删除重复的元组
【发布时间】:2023-03-08 08:22:01
【问题描述】:

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

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))] ].

任何帮助将不胜感激。

【问题讨论】:

    标签: list erlang tuples


    【解决方案1】:

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

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

    【讨论】:

    • 这实际上是一个很好的提示,实际上我忘了提到我们应该使用基本知识来做到这一点,即没有库,但感谢您的帮助。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你刚才打错了,你使用 element(1,T) 而不是 element (1,L)。使用

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

      您的代码有效,但如果您使用大列表,我对性能和堆栈大小感到不满意。

      【讨论】:

      • 这就是为什么你不在半夜编码的原因。非常感谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-17
      • 2020-03-25
      • 1970-01-01
      • 2016-01-09
      • 1970-01-01
      • 2017-12-15
      相关资源
      最近更新 更多