Erlang 设置队列大小的限制

Erlang 设置队列大小的限制,erlang,Erlang,如何将队列设置为容纳N个值。当达到N时,删除最后一项并在队列前面添加一个值 这应该用if语句完成吗 我还想在添加新项目时计算队列中的值。e、 g.添加队列中的所有值。给出注释后,即可: enqueue(Value, Queue) -> Pushed = queue:in(Value, Queue), Sum = fun (Q) -> lists:sum(queue:to_list(Q)) end, case queue:len(Pushed) of

如何将队列设置为容纳N个值。当达到N时,删除最后一项并在队列前面添加一个值

这应该用if语句完成吗


我还想在添加新项目时计算队列中的值。e、 g.添加队列中的所有值。

给出注释后,即可:

enqueue(Value, Queue) ->
    Pushed = queue:in(Value, Queue),
    Sum = fun (Q) -> lists:sum(queue:to_list(Q)) end,
    case queue:len(Pushed) of
        Len when Len > 10 ->
            Popped = queue:drop(Pushed),
            {Popped, Sum(Popped)};
        _ ->
            {Pushed, Sum(Pushed)}
    end.

如果您实际上不想对项目求和,可以改用lists:foldl,或者只编写一个函数直接在队列上执行该操作。

给出注释后,可以这样做:

enqueue(Value, Queue) ->
    Pushed = queue:in(Value, Queue),
    Sum = fun (Q) -> lists:sum(queue:to_list(Q)) end,
    case queue:len(Pushed) of
        Len when Len > 10 ->
            Popped = queue:drop(Pushed),
            {Popped, Sum(Popped)};
        _ ->
            {Pushed, Sum(Pushed)}
    end.

如果您实际上不想对项目进行求和,可以使用lists:foldl,或者只编写一个函数直接在队列上执行操作。

根据您的查询,我假设您都希望最大化队列长度并获得所有值的和

首先回答您最简单的问题:不管您希望如何表示Erlang队列,它们都是普通的Erlang数据结构,因此在字典中存储它们不会有问题

OTP队列模块实际上非常简单,但过多的接口很容易使其难以使用@通过不直接使用队列数据结构,而是定义自己的数据结构(包括队列及其当前长度{length,queue}),Nathon的排队函数可以变得更加高效。如果金额很重要,那么你甚至可以将其包括在内

队列表示非常简单,因此很容易编写自己的专用形式

最简单的方法是将队列保存在一个列表中,从头部提取元素,然后在末尾添加新元素。因此:

new(Max) when is_integer(Max), Max > 0 -> {0,Max,[]}.   %Length, Max and Queue list

take({L,M,[H|T]}) -> {H,{L-1,M,T}}.

add(E, {L,M,Q}) when L < M ->
    {L+1,M,Q ++ [E]};                                   %Add element to end of list
add(E, {M,M,[H|T]}) -
    {M,M,T ++ [E]}.                                     %Add element to end of list
当队列已满时,位于队列前面的最老成员将被丢弃。空队列生成错误。这是一个非常简单的结构,但效率很低,因为每次添加新元素时都会复制队列。反转列表没有帮助,因为每次从列表中删除元素时都会复制列表。但它很简单,而且确实有效

更有效的结构是将队列分成两个列表,队列前端和队列后端。当前端为空时,后端反转并成为新的前端。因此:

new(Max) when is_integer(Max), Max > 0 ->
    {0,Max,[],[]}.                                      %Length, Max, Rear and Front

take({L,M,R,[H|T]}) -> {H,{L-1,M,R,T}};
take{{L,M,R,[]}) when L > 0 ->
    take({L,M,[],lists:reverse(R)}).                    %Move the rear to the front

add(E, {L,M,R,F}) when L < M ->
    {L+1,M,[R|E],F};                                    %Add element to rear
add(E, {M,M,R,[H|T]}) ->
    {M,M,[R|E],T};                                      %Add element to rear
add(E, {M,M,R,[]}) ->
    add(E, {M,M,[],lists:reverse(R)}).                  %Move the rear to the front
同样,当队列已满时,位于队列前面的最老成员将被丢弃,空队列将生成错误。这是队列模块中使用的数据结构

将当前元素的总和添加到结构中并直接管理它将非常容易


通常,在处理类似这样的简单数据结构时,滚动您自己的模块与使用提供的模块一样容易。

我从您的查询中假设,您都希望最大化队列长度并获得所有值的总和

首先回答您最简单的问题:不管您希望如何表示Erlang队列,它们都是普通的Erlang数据结构,因此在字典中存储它们不会有问题

OTP队列模块实际上非常简单,但过多的接口很容易使其难以使用@通过不直接使用队列数据结构,而是定义自己的数据结构(包括队列及其当前长度{length,queue}),Nathon的排队函数可以变得更加高效。如果金额很重要,那么你甚至可以将其包括在内

队列表示非常简单,因此很容易编写自己的专用形式

最简单的方法是将队列保存在一个列表中,从头部提取元素,然后在末尾添加新元素。因此:

new(Max) when is_integer(Max), Max > 0 -> {0,Max,[]}.   %Length, Max and Queue list

take({L,M,[H|T]}) -> {H,{L-1,M,T}}.

add(E, {L,M,Q}) when L < M ->
    {L+1,M,Q ++ [E]};                                   %Add element to end of list
add(E, {M,M,[H|T]}) -
    {M,M,T ++ [E]}.                                     %Add element to end of list
当队列已满时,位于队列前面的最老成员将被丢弃。空队列生成错误。这是一个非常简单的结构,但效率很低,因为每次添加新元素时都会复制队列。反转列表没有帮助,因为每次从列表中删除元素时都会复制列表。但它很简单,而且确实有效

更有效的结构是将队列分成两个列表,队列前端和队列后端。当前端为空时,后端反转并成为新的前端。因此:

new(Max) when is_integer(Max), Max > 0 ->
    {0,Max,[],[]}.                                      %Length, Max, Rear and Front

take({L,M,R,[H|T]}) -> {H,{L-1,M,R,T}};
take{{L,M,R,[]}) when L > 0 ->
    take({L,M,[],lists:reverse(R)}).                    %Move the rear to the front

add(E, {L,M,R,F}) when L < M ->
    {L+1,M,[R|E],F};                                    %Add element to rear
add(E, {M,M,R,[H|T]}) ->
    {M,M,[R|E],T};                                      %Add element to rear
add(E, {M,M,R,[]}) ->
    add(E, {M,M,[],lists:reverse(R)}).                  %Move the rear to the front
同样,当队列已满时,位于队列前面的最老成员将被丢弃,空队列将生成错误。这是队列模块中使用的数据结构

将当前元素的总和添加到结构中并直接管理它将非常容易


通常,在处理类似这样的简单数据结构时,滚动您自己的模块与使用提供的模块一样容易。

我正在考虑使用一个if来检查队列长度,如果queue:lensomeQueue>=10删除最后一项并将新项添加到前面。我遇到的问题是在队列中添加值。这是怎么做到的?首先将其转换为列表,然后使用lists:sum?谢谢排队等候
已满,这将删除第一项,而不是最后一项。公平地说,最后一项可以是最后添加的项,而不是列表中的最后一项。@knutin:第一项和最后一项是语义的。关键是要让它成为一个FIFO,事实就是如此。@alJaree:它已经是一个列表了。或者您真的在尝试使用erlang队列吗?是的,我想使用erlang队列。队列可以存储在字典中吗?我正在考虑使用if来检查队列长度,如果queue:lensomeQueue>=10,则删除最后一项并将新项添加到前面。我遇到的问题是在队列中添加值。这是怎么做到的?首先将其转换为列表,然后使用lists:sum?谢谢当队列已满时,这将删除第一项,而不是最后一项。公平地说,最后一项可以是最后添加的项,而不是列表中的最后一项。@knutin:第一项和最后一项是语义的。关键是要让它成为一个FIFO,事实就是如此。@alJaree:它已经是一个列表了。或者您真的在尝试使用erlang队列吗?是的,我想使用erlang队列。一个队列可以存储在字典里吗?谢谢你的回答,但和我正在做的相比,这是一种紧张的方式。我将使用erlang中的标准队列。然后转换为列表并使用添加值。列表:总和;谢谢你的回答,但和我正在做的相比,这是一种紧张的方式。我将使用erlang中的标准队列。然后转换为列表并使用添加值。列表:总和;