Sorting 排序和添加问题
我是哈斯克尔的初学者。我在haskell中编写代码来读取文本文件并打印第2列和第4列,但我不知道在哪里放置排序机制,第2列由数字组成,因此如果数字重复,则应添加其值并显示ex的总数 2 | 23.45 4 | 36.89 1 | 77.20 2 | 20.20 所以输出应该是 1 | 77.20 2 | 43.65 4 | 36.89 我的代码是:Sorting 排序和添加问题,sorting,haskell,addition,Sorting,Haskell,Addition,我是哈斯克尔的初学者。我在haskell中编写代码来读取文本文件并打印第2列和第4列,但我不知道在哪里放置排序机制,第2列由数字组成,因此如果数字重复,则应添加其值并显示ex的总数 2 | 23.45 4 | 36.89 1 | 77.20 2 | 20.20 所以输出应该是 1 | 77.20 2 | 43.65 4 | 36.89 我的代码是: module Main where import Data.List.Split(splitOn) import Data.List (inter
module Main where
import Data.List.Split(splitOn)
import Data.List (intercalate)
project :: [Int] -> [String] -> [String]
project indices l = foldl (\acc i -> acc ++ [l !! i]) [] indices
fromString :: String -> [[String]]
fromString = map (splitOn "|") . lines
toString :: [[String]] -> String
toString = unlines . map (intercalate "|")
main :: IO ()
main = do
putStrLn =<<
return . toString . map (project [1, 3]) . fromString =<<
readFile("table.txt")
modulemain其中
导入数据.List.Split(splitOn)
导入数据列表(插入)
项目::[Int]->[String]->[String]
项目索引l=foldl(\acc i->acc++[l!!i])[]索引
fromString::String->[[String]]
fromString=map(splitOn“|”)”。线
toString::[[String]]->String
toString=未对齐。地图(插入“|”)
main::IO()
main=do
putStrLn=您应该在映射之后排序:
main :: IO ()
main = do
putStrLn =<<
return . toString . sort . map (project [1, 3]) . fromString =<<
readFile("table.txt")
这仍然有几个问题:
- 它将ID排序为字符串,而不是数字(例如,11排在4之前)
- 它不会添加具有相同ID的项目
我的建议是:
首先将数据转换为[(Int,Double)]
(查看read
,或者——如果您想明智地处理格式错误的数据——reads
)李>
对列表进行排序
应用自定义函数汇总相同的ID条目。对于初学者来说,这是一个很好的列表处理练习。把下面的空白填好。记住你可以使用递归
sumSameId :: [(Int,Double)] -> [(Int,Double)]
sumSameId [] = ???
sumSameId [(i,d)] = ???
sumSameId ((i1,d1):(i2,d2):rest) = if i1==i2 then ??? else ???
我刚刚意识到,您的代码实际上并不是您的,而是逐字逐句地从中提取的。老实说,它看起来像是您复制了代码,而没有努力去理解它,现在正试图使用stackoverflow作为编码服务使其工作。当然,情况可能并非如此,但它看起来确实如此。请记住,我们通常更热衷于帮助那些表现出一定努力的人。他实际上也可以使用do
符号:main=do s根据你的建议,我在“toString”之后加上了“sort”,但我得到的错误是“不在范围‘sort’”@Rahul您可以从数据导入排序
。List
@DavidYoung是的,它可以工作,谢谢,但正如我在问题中提到的那样。如果两个ID相同,我必须进行加法。例2 | 23.45 4 | 36.89 1 | 77.20 2 | 20.20它应该这样打印。。。1 | 77.20 2 | 43.65 4 | 36.89如果左侧有相同的数字,则其右侧值应相加并显示总数。。
sumSameId :: [(Int,Double)] -> [(Int,Double)]
sumSameId [] = ???
sumSameId [(i,d)] = ???
sumSameId ((i1,d1):(i2,d2):rest) = if i1==i2 then ??? else ???