David
David

Reputation: 3105

Haskell sort values from list

I'm new to haskell and I want to sort list of strings. For example I have a list that is in my variable ff that contain three strings ["1 8 8 5 6", "1 4 2 3", "5 4 9 7 9 9"] and I want to sort them so my result should look like ["1 5 6 8 8", "1 2 3 4", "4 5 7 9 9 9"] Here's my code that perfectly works

import System.IO  
import Control.Monad
import Data.List
import Data.Function
import Data.Array
import Data.Char

sortNumeric = sortBy (compare `on` (read :: String -> Int))
wordsWhen :: (Char -> Bool) -> String -> [String]
wordsWhen p s =  case dropWhile p s of
                      "" -> []
                      s' -> w : wordsWhen p s''
                            where (w, s'') = break p s'
main = do
  file <- readFile "test.txt"
  let ff = map ((!!) (lines file)) [1,3..(length (lines file) - 1)]
  let splitString =  wordsWhen (==' ') (ff!!0)
  let sortedResult = sortNumeric (splitString)
  print sortedResult

Problem is with this line let splitString = wordsWhen (==' ') (ff!!0) I always get first element of the list, so only first element is sorted. How can I pass all values of a list? Here's what I tryied to do let splitString = wordsWhen (==' ') (ff!![0..(length(ff)-1)]) unfortunately this doesn't work. Any ideas how to solve this problem?

Upvotes: 0

Views: 1408

Answers (1)

vikingsteve
vikingsteve

Reputation: 40378

You can do it easily with map and a niftry trick to use words, sort and then unwords (to restore the whitespace).

Prelude> let ff=["1 8 8 5 6", "1 4 2 3", "5 4 9 7 9 9"]
Prelude> import Data.List
Prelude Data.List> map (unwords . sort . words) ff
["1 5 6 8 8","1 2 3 4","4 5 7 9 9 9"]

Edit: Improvement to correctly sort numeric values:

import Data.List
let ff=["11 8 8 5 6", "11 4 2 3", "5 4 9 7 99 9"]
let sortNumeric = (map show) . sort . (map (read :: String -> Int))
map (unwords . sortNumeric . words) ff

result:

["5 6 8 8 11","2 3 4 11","4 5 7 9 9 99"]

Upvotes: 6

Related Questions