2011-12-20 129 views
-2

從另一個列表中減去一個列表最簡單的方法是什麼?我需要使用ListPair來解決這個任務嗎?請注意,我需要比較ROWS,而不是單個元素。舉例來說,有兩個列表 「L1」 和 「L2」:SML:從另一個列表中減去一個列表

L1 = 
[(1, 2, 3), 
(4, 5, 6)] 

L2 = 
[(1, 2, 3), 
(4, 5, 6), 
(3, 2, 3] 

我需要通過應用L3 = L2-L1獲得 「L3」:

L3 = 
[(3, 2, 3)] 

感謝。

+0

你想從L2中刪除也是L1中的元素,但是每個L1中只發生一次的元素是否正確? – Sarah 2011-12-21 09:53:18

+0

如果L1不是L2的前綴,您打算如何處理? – 2011-12-21 10:21:54

+0

它是正確的。但可能有多個事件,這些事件也應該被刪除。 – 2011-12-21 10:25:17

回答

1

正如我所理解的問題,你想刪除L2中也是L1中的元素,但每次出現只有一次。

一個簡單的解決方案可能會涉及一個輔助函數,告訴您在L1中是否找到元素,以及刪除此元素的L1的其餘部分。

fun remFirst _ [] rest = (false, rev rest) 
    | remFirst x (y::ys) rest = 
    if x = y then 
     (true, rev rest @ ys) 
    else 
     remFirst x ys (y :: rest) 

現在,你可以通過L2迭代,每次remFirst返回true丟棄元素,然後用列表的其餘部分進行。

如果您想要刪除L2與L1共有的前綴,事情會變得簡單一些。

fun remPref [] _   = [] 
    | remPref xs []   = xs 
    | remPref (x::xs) (y::ys) = if x = y then remPref xs ys else (x::xs) 

更新:問題現在已被改變。

如果現在要求從L2中刪除L1中的元素,則過濾器很有用。

List.filter (fn x => List.all (fn y => x <> y) L1) L2 
+0

謝謝,但我需要比較ROWS,而不是列表中的單個元素。 – 2011-12-21 19:39:46

+0

你的問題從來沒有提到元組列表,但很好,我會適應我的答案。儘管如此,儘量更確切些。 – Sarah 2011-12-22 10:08:52

相關問題