首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在elixir中交换Map中的两个值的函数方法是什么?

在elixir中交换Map中的两个值的函数方法是什么?
EN

Stack Overflow用户
提问于 2018-11-05 18:26:12
回答 2查看 192关注 0票数 1

我有一个地图,定义如下:

代码语言:javascript
复制
iex(tbc@192-168-1-8)2> map = %{ 1 => {name => "Joey"}, 2 => {name => "Lee"}}

我想要交换这两个名称的值,使其看起来像:

代码语言:javascript
复制
%{1 => %{"name" => "Lee"}, 2 => %{"name" => "Joey"}}

我知道我可以使用以下代码来实现这一点:

代码语言:javascript
复制
iex(tbc@192-168-1-8)3> name1 = Map.get(map, 1)
%{"name" => "Joey"}
iex(tbc@192-168-1-8)4> name2 = Map.get(map, 2)
%{"name" => "Lee"}
iex(tbc@192-168-1-8)5> map = Map.put(map, 1, name2)
%{1 => %{"name" => "Lee"}, 2 => %{"name" => "Lee"}}
iex(tbc@192-168-1-8)6> map = Map.put(map, 2, name1)
%{1 => %{"name" => "Lee"}, 2 => %{"name" => "Joey"}}

但我不认为这是elixir风格的编码。在elixir中实现这一逻辑的函数方式是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-05 18:55:08

您可以继续使用with块,首先提取名称,然后使用它们创建新地图:

代码语言:javascript
复制
with name1 <- Map.get(map, 1),
     name2 <- Map.get(map, 2)
do
     %{1 => name2, 2 => name1}
end

或者,您可以执行一个简单的函数,对键进行模式匹配,获得值并生成新的映射:

代码语言:javascript
复制
def swap(%{1 => name1, 2 => name2} do
     %{1 => name2, 2 => name1}
end

在这两种情况下,最终结果是相同的,这取决于您自己的喜好。

票数 5
EN

Stack Overflow用户

发布于 2018-11-06 22:38:22

您可以通过访问旧映射的值来定义新映射:

代码语言:javascript
复制
%{1 => map[2], 2 => map[1]}

如果您希望交换两个元素,同时保留映射的其余部分,则可以使用

代码语言:javascript
复制
%{ map | 1 => map[2], 2 => map[1] }

在iex中:

代码语言:javascript
复制
iex(1)> map = %{1 => "one", 2 => "two", 3 => "three", 4 => "four"}
%{1 => "one", 2 => "two", 3 => "three", 4 => "four"}
iex(2)> %{ map | 1 => map[2], 2 => map[1] }
%{1 => "two", 2 => "one", 3 => "three", 4 => "four"}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53152495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档