【问题标题】:Generating String from List in Erlang在 Erlang 中从 List 生成字符串
【发布时间】:2011-05-11 20:26:02
【问题描述】:

我正在尝试根据列表生成格式化字符串:

[{"Max", 18}, {"Peter", 25}]

到一个字符串:

"(Name: Max, Age: 18), (Name: Peter, Age: 35)"

【问题讨论】:

  • 你想对字符串做什么?

标签: string list erlang


【解决方案1】:

第一步是制作一个可以将您的 {Name, Age} 元组转换为列表的函数:

format_person({Name, Age}) ->
    lists:flatten(io_lib:format("(Name: ~s, Age: ~b)", [Name, Age])).

接下来就是简单的将这个函数应用于列表中的每个元素,然后将它们连接在一起。

format_people(People) ->
    string:join(lists:map(fun format_person/1, People), ", ").

扁平化的原因是 io_lib 返回的是 iolist 而不是扁平化列表。

【讨论】:

  • 你着火了,伙计……看看你的 sha 回复,它也很可靠……:)
  • 或者您可以在两个假设下将其缩短为单行:string:join([ io_lib:format("(Name: ~s, Age: ~b)", [Name,Age]) || {Name,Age} <- People ], ", ") 假设是 a) string:join/2 适用于 io_lib:format/2 输出,它在我的测试中执行,并且 b ) 您的输出函数可以将生成的未展平的嵌套字符列表作为字符串处理(它们确实应该这样做)。
  • 哦,是的,当然,还有更短的方法。我的目的是展示一个简单的实现。
【解决方案2】:

如果性能很重要,您可以使用此解决方案:

format([]) -> [];
format(List) ->
  [[_|F]|R] = [ [", ","(Name: ",Name,", Age: ",integer_to_list(Age)|")"]
              || {Name, Age} <- List ],
  [F|R].

但请记住,它返回 io_list(),因此如果您想查看结果,请使用 lists:flatten/1。这是在 Erlang 中编写非常高效的字符串操作的一种方式,但只有在性能远比可读性和可维护性更重要时才使用它。

【讨论】:

    【解决方案3】:

    一个简单但缓慢的方法:

    string:join([lists:flatten(io_lib:format("(~s: ~p)", [Key, Value])) || {Key,Value} <- [{"Max", 18}, {"Peter", 25}]], ", ").
    

    【讨论】:

    • 为什么你认为这很慢?
    • @Peer Stitzinger:因为string:join/2lists:flatten/1io_lib:format/2 都被认为不太有效。
    【解决方案4】:

    是 JSON 吗?

    使用一些已经编写好的模块,例如 mochiweb。

    【讨论】:

      猜你喜欢
      • 2011-09-03
      • 2015-03-17
      • 2014-05-23
      • 2012-09-29
      • 2016-02-22
      • 2015-03-05
      • 2014-12-13
      • 2017-05-15
      • 2011-09-16
      相关资源
      最近更新 更多