【问题标题】:Erlang: check duplicate elementsErlang:检查重复元素
【发布时间】:2016-11-02 13:45:04
【问题描述】:

我正在尝试创建读取 {Jid, Text} 的函数并检查它是否已经在列表中返回 true 否则如果不是,则此函数应将其附加到列表中然后返回 false

我正在做的是:

new_seen() -> [{"user@domain.tld", "hello"}].

check({Jid, Text}) ->
    Term = {Jid, Text},
    case lists:member(Term, new_seen()) of
        true -> true;
        false ->
            %% here I want to add {Jid, Text} to new_seen() list.
            false
    end.

简单示例:

check({"us1@domain.tld", "hi"}).
%% here should appened {"us1@domain.tld", "hi"} to the list and return false.


%% if I run function again :
check({"us1@domain.tld", "hi"}).

%% here should return True cuz {"us1@domain.tld", "hi"} in the list.

我想将它与 ejabberd 一起使用来检查是否重复插入的消息。

【问题讨论】:

  • 您有什么需求?您需要在该列表中保存哪些数据?它是一个大数据库吗?您可能需要检查Erlang ETSProcess Dictionary
  • @A.Sarid 是的,它是一个大数据库。是的,但我不应该使用 ets 或处理字典,因为数据太多。我在这里也问过:stackoverflow.com/questions/35958767/…有什么办法吗?
  • 您似乎在上一个问题中得到了答案。那么,为什么不将 ETS 用于您的数据库呢?它应该完全适合大型数据库。
  • @A.Sarid 我编辑我的问题。
  • @A.Sarid 这是真的吗? paste.ubuntu.com/18170115

标签: erlang ejabberd


【解决方案1】:

您是否也检查过不同的数据库,例如 mnesia (Kev/Value Storage)?也许他们可以 似乎map 可以帮助您。您可以访问特定键的值。您还应该检查learnyousomeerlang

如果您需要一个列表,只需附加该元素。使用您的代码:

check({Jid, Text}) ->
    Term = {Jid, Text},
    case lists:member(Term, new_seen()) of
        true -> true;
        false ->
            %% here I want to add {Jid, Text} to new_seen() list.
            NewList = [Term|new_seen()]
    end,
NewList.

您必须返回新列表并将其保存在其他位置,因为您无法在 new_seen() 函数中更新列表。 如果确实需要返回 true,请将其放在最后一行:{true, NewList},它返回 true 的元组和新列表。

【讨论】:

  • 没错,但我猜如果他需要一个数据库,他应该将此列表作为另一个参数添加到函数中:check({Jid, Text}, Database)。并使用Database 而不是调用new_seen()
猜你喜欢
  • 2016-06-27
  • 2012-10-10
  • 1970-01-01
  • 2010-09-14
  • 2015-07-28
  • 2016-06-07
  • 2011-06-15
  • 2017-06-19
  • 2013-06-28
相关资源
最近更新 更多