如何删除列表中的元素?

问题描述:

我实现了一个功能,它通过一个删除列表中的一个元素:如何删除列表中的元素?

remove(_,[])-> 
    []; 
remove(Elem, L)-> 
    Rest = lists:delete(Elem,L), 
    remove(Elem,Rest). 

,但它挂起当我试图用这个例子:

L = [1,2,3,4]. 
remove(hd(L), [L]). 

有什么不妥的地方。还是有更好的方法从列表的第一个元素开始逐个删除列表中的元素。

它使无限循环。首先,你叫

remove(1, [1,2,3,4]) -> 
    [2,3,4] = lists:delete(1, [1,2,3,4]), 
    remove(1, [2,3,4]). 

所以你打电话

remove(1, [2,3,4]) -> 
    [2,3,4] = lists:delete(1, [2,3,4]), 
    remove(1, [2,3,4]). 

然后再次以相同的输入,并一次又一次地调用它。

一个解决它的方法是检查是否lists:delete/2返回相同的结果

remove(Elem, L)-> 
    case lists:delete(Elem,L) of 
    L -> L; 
    Rest -> remove(Elem,Rest) 
    end. 

(功能条款remove(_,[])是没有必要的,即使它不会做任何伤害。)

但是还有一个更strightforward方法:

remove(_, []) -> []; 
remove(H, [H|T]) -> 
    remove(H, T); 
remove(X, [H|T]) -> 
    [H | remove(X, T)]. 

这可以通过遍历这样写:

remove(X, L) -> 
    [Y || Y <- L, Y =/= X]. 

生成的代码基本相同。

+0

谢谢主席先生,但还是删除(HD([]),[])抛出一个异常 – erlang

+0

@erlang你没说什么异常是。这很重要。 – Carcigenicate

+0

异常错误:bar参数,因为hd([]) – erlang

您也可以使用lists模块,它定义了很多有用的功能。

拿这个举例来说,你的情况:

1> A = [1,2,3,4,5,6,7,8,9,10]. 
[1,2,3,4,5,6,7,8,9,10] 
2> B = [2,3,4]. 
[2,3,4] 
3> lists:filter(fun (Elem) -> not lists:member(Elem, B) end, A). 
[1,5,6,7,8,9,10]