我有以下代碼,它接受一個 int 值并洗掉串列中的前 n 個元素。
removeEle :: Int -> [a] -> [a]
removeEle n xs
| ((n <= 0) || null xs) = xs
| otherwise = removeEle (n-1) (tail xs)
我將如何附加它以便它可以通過它們的第二個元素在元組串列上作業?等等
[(String1, 50)], [(String2, 600)], [(String3, 10)]
uj5u.com熱心網友回復:
您無法修改當前的解決方案以洗掉第一個n最小的元素。為了能夠洗掉第一個n最小的,您需要對整個串列進行總排序,以便您可以決定哪些元素在n最小的間隔中。
一個簡單的解決方案是對串列進行排序并洗掉第一個n元素。但是,此解決方案不會保留原始順序。
使用soryBy和dropfromData.List您可以執行以下操作:
removeNSmallest :: Ord a => Int -> [(String, a)] -> [(String, a)]
removeNSmallest n xs = drop n $ sortBy (\(_, a) (_, b) -> compare a b) xs
正如@Micha Wiedenmann 指出的那樣,您可以使用sortBy(比較 snd)對元組進行排序。
一個小測驗:
λ> removeNSmallest 1 [("String1", 50), ("String2", 600), ("String3", 10)]
[("String1",50),("String2",600)]
為了保留原始順序,一種解決方案是為元組的第二個元素創建一個單獨的有序串列。然后遍歷原始串列,對于有序串列中的每個元素,從原始串列中洗掉一個。
如果您使用drop以下方法撰寫,則用于洗掉串列前 n 個元素的原始解決方案將更具可讀性:
removeEle :: Int -> [a] -> [a]
removeEle n xs = drop n xs
或者,如果您想使用顯式遞回:
removeEle :: Int -> [a] -> [a]
removeEle _ [] = []
removeEle 0 xs = xs
removeEle n x:xs = removeEle (n-1) xs
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/382202.html
上一篇:獲得所有可能的翻譯產品
下一篇:將串列中的連續數字組合在一起
