2017-04-13 3 views

答えて

3

は、これを実行する最も簡単な方法です:

# 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] 
+0

ok。私は単にキーとマップのリストを持っていて、どのキーがマップに存在していないかをチェックしたいのですが、どうしたらいいですか? – Otoma

+0

['Map.has_key?'](https://hexdocs.pm/elixir/Map.html#has_key?/2)などを使うことができます: 'keys - Map.keys(map)' – Sheharyar

+0

' - '? – Otoma

3

--は、大規模なリストのための非常に非効率的です。あなたはすでにマップを持っているので、を使ってO(log n)の時間内にあるキーの存在を調べることができます。

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 

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] 

大きな地図で迅速なベンチマークはKernel.--/2対巨大なパフォーマンスの違いを示しています。フィルター付きforシンプルなあなたが望む結果を得るために使用することができます

マップが小さい場合でも、--はこれよりもやや短く読みやすくなり、十分に良いはずです。

関連する問題