2017-05-22 20 views

回答

2

您可以爲兩個列表創建一個列表名稱集合,將它們相交以找到常用名稱,然後過濾掉所有常見的名稱。這裏是你如何可以與MapSet模塊中的藥劑做到這一點:

l1 = [%{name: "hi"}, %{name: "hu"}] 
l2 = [%{name: "hi"}, %{name: "ha"}] 

# set of names 
s1 = for x <- l1, into: MapSet.new, do: x.name 
s2 = for x <- l2, into: MapSet.new, do: x.name 

# set of common names 
common = MapSet.intersection(s1, s2) 

# filter out any name that's in `common` 
l1_unique = for x <- l1, !MapSet.member?(common, x.name), do: x 
l2_unique = for x <- l2, !MapSet.member?(common, x.name), do: x 

IO.inspect l1_unique 
IO.inspect l2_unique 

輸出:

[%{name: "hu"}] 
[%{name: "ha"}] 
1

使用相同的思路@Dogbert,我更喜歡下面的代碼片段,因爲你少做迭代,

l1 = [%{name: "hi"}, %{name: "hu"}] 
l2 = [%{name: "hi"}, %{name: "ha"}] 

set = MapSet.new(l1 ++ l2) 

l1_uniq = Enum.reject(set, &(Enum.member?(l2, &1))) 
l2_uniq = Enum.reject(set, &(Enum.member?(l1, &1))) 

可以達到同樣的解決方案,而無需使用MapSet

l1 = [%{name: "hi"}, %{name: "hu"}] 
l2 = [%{name: "hi"}, %{name: "ha"}] 

set = Enum.uniq(l1 ++ l2) 

l1_uniq = Enum.reject(set, &(Enum.member?(l2, &1))) 
l2_uniq = Enum.reject(set, &(Enum.member?(l1, &1))) 
相關問題