我有2个地图。有什么方法可以找出Map
中存在哪些密钥,但它们在另一个中不存在?查找存在于一个地图中但不在另一个地图中的键
1
A
回答
3
使用Map.keys/1
与--
是做到这一点的最简单的方法:
# Suppose your two maps are:
map_a = %{a: 1, b: 2, c: 3, d: 4}
map_b = %{c: 3, d: 4, e: 5, f: 6}
# Get keys present in map_a but not in map_b
a_b_diff = Map.keys(map_a) -- Map.keys(map_b) # => [:a, :b]
# Get keys present in map_b but not in map_a
b_a_diff = Map.keys(map_b) -- Map.keys(map_a) # => [:e, :f]
3
--
是大型列表极其低效。由于您已经拥有地图,因此您可以使用Map.has_key?/2
查找O(log n)
时间内任意键的存在。一个简单的for
有过滤器可以用来获得你想要的结果:
iex(1)> map1 = %{a: 1, b: 2, d: 3, f: 4}
%{a: 1, b: 2, d: 3, f: 4}
iex(2)> map2 = %{b: 5, c: 6, f: 7, g: 8}
%{b: 5, c: 6, f: 7, g: 8}
iex(3)> for {k, _} <- map1, !Map.has_key?(map2, k), do: k
[:a, :d]
快速基准与大地图显示了巨大的性能差异VS Kernel.--/2
:
map1 = for x <- Enum.take_random(1..10000, 5000), into: %{}, do: {x, x}
map2 = for x <- Enum.take_random(1..10000, 5000), into: %{}, do: {x, x}
{time, result1} = :timer.tc(fn ->
Map.keys(map1) -- Map.keys(map2)
end)
IO.puts "--: #{time}µs"
{time, result2} = :timer.tc(fn ->
for {k, _} <- map1, !Map.has_key?(map2, k), do: k
end)
IO.puts "for: #{time}µs"
IO.inspect result1 == result2
输出:
--: 113367µs
for: 739µs
true
如果你的地图虽然很小,但是--
肯定比这个短一些,可读性也应该足够好。
相关问题
- 1. 查找键值在地图
- 2. 在地图中查找键值
- 3. 访问另一个viewController中的地图
- 4. 比较两个地图并在javascript中添加一个地图的关键字
- 5. C#DataTable查找不存在于另一个DataTable中的行
- 6. 在Java地图中创建另一个地图中的值的流
- 7. 从Java中的另一个地图创建地图
- 8. MYSQL - 查找一个表中的记录不存在,在另一
- 9. 我如何在基于scala模式匹配的地图中找到一个键
- 10. 查找在另一个查询中不存在的记录
- 11. 在地图中查找field
- 12. r,这些数字存在于一个向量中,但不在另一个中
- 13. 在Android中的另一个活动中嵌入地图活动
- 14. 如何寻找在一个Groovy地图的关键是类GStringImpl
- 15. 将谷歌地图嵌入到一个页面中:虽然HTML中存在地图,但不能看到
- 16. 检查另一个图中是否存在一个图的节点
- 17. ListView在视图中一个接一个地加载图像
- 18. 从一个表中查找不存在于另一个表中的记录并在第三个表中忽略
- 19. C#检查一个图像是否存在于另一个图像
- 20. 查找地图中的前十个值
- 21. 如何在Freemarker模板中添加地图到另一个地图
- 22. 在Java中实现一个地图
- 23. Zend在另一个视图中查看
- 24. 在一个表中查找标识不是在另一个
- 25. 将Elixir中的同一个键上的两个地图组合在一起
- 26. 地图上一个TreeMap返回一个地图,而不是在斯卡拉
- 27. PHP:在另一个表中的地方
- 28. 地图一个地图的Java
- 29. 在Google地图上显示InfoWindow高于另一个Dom元素
- 30. 复制的std ::地图数据到另一个地图
好的。如果我只是有一个键和一张地图的列表,我想检查哪些键不存在于地图中,我该怎么做? – Otoma
你可以使用['Map.has_key?'](https://hexdocs.pm/elixir/Map.html#has_key?/2)或类似的东西:'keys - Map.keys(map)' – Sheharyar
什么是'--'? – Otoma