2012-06-29 29 views
0

如何將未排序單詞列表轉換爲元組列表(單詞,count),按字詞排序(fst)min-max不區分大小寫?快速排序列表並將其轉換爲元組列表(elem,count)

["AAA","America", "England", "Spain"," Ireland"," aeroplane", 
"aeroplane", "Aeroplane", "AeRoPlAne", "helicopter", "HELICOPTER", 
"Zebra", "America", "Elephant", "abc", "A.B.C." , "haskell", "Haskell", "ZZZ", "zzz"] 

預期成果:

[("a.b.c.",1),("aaa",1),("abc",1),("aeroplane",4),("america",2),("elephant",1) 
,("england",1),("haskell",2),("helicopter",2),("ireland",1),("spain",1),("zebra",1),("zzz",2)] 

[("a.b.c",1), ("zzz", 2)] 
+0

我們展示的代碼和確切的錯誤。 –

+0

@DanielWagner:先生,請訪問我的問題http://stackoverflow.com/questions/11261974/complete-set-of-indentation-rules-in-haskell它有所有的細節,你可能需要了解我的確切的錯誤結束。 – Optimight

+0

@Optimight目前還不清楚你的意思是最小最大字數還是數字。請糾正我在編輯中丟失的任何內容。 – jdeseno

回答

2

我已經打破下來到步驟,應該使這個更容易把握。首先,對列表進行排序,然後將其縮減爲(Word,Count)元組列表。

import Data.Char (toLower) 

quicksort :: (Ord a) => [a] -> [a] 
quicksort [] = [] 
quicksort (x:xs) = 
    (quicksort [a|a<-xs, a<=x]) ++ [x] ++ (quicksort [a|a<-xs, a>x]) 

addCount :: String -> [(String, Int)] -> [(String, Int)] 
addCount a [] = [(a, 1)] 
addCount a (x:xs) 
    | a == fst x = (fst x, (snd x) + 1) : xs 
    | otherwise = x : (addCount a xs) 

occurrences :: [(String, Int)] -> [String] -> [(String, Int)] 
occurrences counts [] = counts 
occurrences counts (x:xs) = 
    occurrences countL xs 
    where countL = addCount x counts 

myList = ["AAA","America", "England", "Spain","Ireland", "aeroplane", 
      "aeroplane", "Aeroplane", "AeRoPlAne", "helicopter", "HELICOPTER", 
      "Zebra", "America", "Elephant", "abc", "A.B.C." , "haskell", "Haskell", 
      "ZZZ", "zzz"] 

main = do 
    let downcased = map (map toLower) myList 
    let sorted = quicksort downcased 
    let occurencesL = occurrences [] sorted 
    putStrLn . show $ occurencesL 
    putStrLn . show $ [head occurencesL, last occurencesL] 

這是非常冗長,但,我希望你有一個更簡單的時間瞭解發生了什麼這樣。

較短方式的例子:

import Data.Char (toLower) 
    import Data.List 

    main = do 
    let l = map (\a -> (head a, length a)) $ groupBy (\x y -> (map toLower x) == (map toLower y)) myList 
    putStrLn . show $ l 
    putStrLn . show $ [head l, last l] 
+0

非常感謝您的意見。我是一名haskell初學者,經歷了學習 - 你 - 哈斯克爾。不知道如何運行main?請指導。我跑快速排序,它的工作原理,但發生部分的結果不知道如何得到它? – Optimight

+0

你應該把它放在一個以'hs'結尾的文件中,比如說「Sort.hs」。運行單個文件的最簡單方法是使用'runghc'或'runhaskell'命令,例如。在我的Mac上運行'runghc Sort.hs'。這在Linux上是一樣的,但我不確定Windows的情況。 您也可以從GHCI運行;用':l排序'運行'main'加載文件。 – jdeseno

+0

我絕對希望看到最簡潔的代碼。到目前爲止,我沒有發現任何閱讀和理解代碼的困難。我的問題是我得到解析錯誤,由於我的代碼或編輯器工具問題或什麼(奇怪)中的一些縮進問題。 – Optimight

1

這裏是一個班輪:

Data.List.sort $ Data.Map.toList $ Data.Map.fromListWith (+) [(map Data.Char.toLower word, 1) | word <- lst] 
0

分組功能:

myGroup :: [[Char]] -> [([Char],Int)] 
myGroup = fmap (\x -> (head x,length x)) . groupBy (==) . sort . fmap (fmap toLower . filter (not . isSpace)) 

請注意,我假設你想從字符串中刪除空格。您可以通過更改過濾器來輕鬆更改該部分。

然後界限功能:

headLast :: [t] -> [t] 
headLast xs = [head xs,last xs] 
+0

我想計算列表中特定單詞的出現次數,而不考慮它的字體大小寫。 – Optimight