2010-12-02 6 views
2

X가 X 자의 형식 인 String 목록이 있습니다. 여기서 X는 최대 4 자리 숫자입니다 (이미지 크기는 (픽셀) x (픽셀)). 예를 들어두 좌표에서 이미지 크기를 정렬하려면 어떻게해야합니까?

:

["192x192","64x84","96x96","64x64","292x192","32x32","64x12"] 

수 업에만 보이는 삽입 정렬 그냥 함수 mySort 사용을위한 X :

["192x192","292x192","32x32","64x84","64x64","64x12","96x96"] 
:
mysort [] = [] 
mysort [x] = [x] 
mysort (x:xs) = insert (mysort xs) 
    where insert [] = [x] 
      insert (y:ys) | takeUntilX x <= takeUntilX y = x : y : ys 
         | otherwise = y : insert ys 

나는이를 얻을 수

부분적으로 만 정렬 된 모든 "64x **"원래 순서대로 리마킹되어 있지만 그 둘을 원합니다. - 기능 mySort을 수정하거나 부분적으로 정렬 된 목록을 정렬 새로운 함수를 작성

["192x192","292x192","32x32","64x12","64x64","64x84","96x96"] 

어떤 더 나은 해결책이 될 것입니다 : 그래서 분류 나는이 얻을? 내가 할 수있는 기본적인 아이디어를 줄 수 있습니까?

답변

8
import Data.List 
import Data.List.Split 

res = map (intercalate "x") . sort . map (splitOn "x") 

내가 염두에두고 미래의 요구를 들어 http://hackage.haskell.org/package/split

+0

:) 저와는 달리 매일 하스켈을 실제로 사용하는 누군가가 항상 있습니다. 공정한 플레이 - +1 –

+0

작동하지 않습니다. 정렬 : [ "192x192", "292x192", "32x32", "64x124", "64x64", "292x192", "32x32", "64x12" 64x184 ","64x64 ","96x96 "] 64x가 틀리다 – ostochast

+0

@ 외관상으로는 : 아래를 본다 - 나는 당신이 말한 것을 알아 냈다. –

0

편집 : 수정 됨 - 귀하가 의미하는 바를 알아 냈습니다.

나는 (1) 문자열을 파싱하여 치수를 얻는다. (2) 적합하다고 생각하지만 치수를 정렬하십시오. (3) 치수를 다시 문자열로 변환합니다. 즉 :

import List 

stringToDim :: String -> (String,String) 
stringToDim s = (a,c) 
    where (a,b) = break (== 'x') s 
      c = drop 1 b 

dimToString :: (String,String) -> String 
dimToString (x,y) = x ++ "x" ++ y 

dimsort :: [String] -> [String] 
dimsort = map dimToString . sort . map stringToDim 
3

에서 Data.List.Split를 사용하고, 당신은 또한 수 :
1. 튜플 예를 들어, 귀하의 데이터를 변환 (64, 64)
2. 내장 정렬을 사용하십시오. 그것은 당신이 원하는 것을 exactly 할 것입니다.

나는 미래에 당신이 정수로 데이터를 사용할 것이므로, 가능한 빨리 변환하면 장래에 많은 문제를 줄일 수 있다고 생각합니다.

BR,
주하

0

좋아, 여기에 내가 내가 요구 originaly 무엇 아니지만 만족 해요 최종 솔루션입니다. 최대 taldykin에서 수정 된 사본 : 그것은 수득 does't 있지만

res x = map (intercalate "x") $ map myshow $ sort $ map (readAsInt) $ map (splitOn "x") x 

readAsInt [x,y] = [read x :: Int, read y ::Int] 
myshow [x,y] = [show x, show y] 

input: ["192x192","64x184","96x96","64x64","292x192","32x32","64x12"] 
output: ["32x32","64x12","64x64","64x184","96x96","192x192","292x192"] 

[ "192x192", "292x192", "32 × 32", "64x12", "64 × 64"은 "64x184"는 "96x96 크기는"]는 것이다 아직도 내가 마음에 두었던 것을 위해 ok.

+0

예, 내 잘못입니다. "sort"를 "sortBy (readAsInt 비교)"로 변경하는 것이 더 간결합니다. "비교"는 Data.Ord –

+0

...이고 결과로 튜플을 사용하여 "readAsInt [x, y] = (read x :: Int, read y :: Int)"입니다. –

관련 문제