Sorting 如何在两个坐标上对图像大小进行排序?

Sorting 如何在两个坐标上对图像大小进行排序?,sorting,haskell,Sorting,Haskell,我有一个字符串列表,其形式为XxX,其中X是最长为4位的数字(它们是以(像素)X(像素)表示的图像大小) 例如: ["192x192","64x84","96x96","64x64","292x192","32x32","64x12"] 使用函数mySort,它只是插入排序,只查看x以下的数字: mysort [] = [] mysort [x] = [x] mysort (x:xs) = insert (mysort xs) where insert [] = [x]

我有一个字符串列表,其形式为XxX,其中X是最长为4位的数字(它们是以(像素)X(像素)表示的图像大小)

例如:

["192x192","64x84","96x96","64x64","292x192","32x32","64x12"]
使用函数mySort,它只是插入排序,只查看x以下的数字:

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**”仍按原始顺序排列,但我希望它们也能被排序,因此我得到以下结果:

["192x192","292x192","32x32","64x84","64x64","64x12","96x96"]
["192x192","292x192","32x32","64x12","64x64","64x84","96x96"]
有什么更好的解决方案-修改函数mySort或编写一个新函数对部分排序的列表进行排序? 你能告诉我这两种方法的基本原理吗?

编辑:更正--我已经明白你的意思了

我将分离出关注点——(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

我正在使用Data.List.Split from

以满足将来的需要,您也可以:
1.将数据转换为元组,例如(64,64)
2.使用内置排序。它完全符合你的要求

我假设将来您将使用数据作为整数,因此尽早转换它们可以在将来为您节省很多麻烦

br,

Juha

好的,这是我满意的最终解决方案,尽管它不是我最初要求的。max taldykin的修改副本:

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”、“32x32”、“64x12”、“64x64”、“64x184”、“96x96”],但我的想法仍然是正确的。

:)总有人每天实际使用Haskell(与我不同)。公平竞争-+1不起作用;排序:[“192x192”、“64x184”、“96x96”、“64x64”、“292x192”、“32x32”、“64x12”]给出的[“192x192”、“292x192”、“32x32”、“64x12”、“64x12”、“64x184”、“64x64”、“96x96”]64是wrong@Ostensibly:请参见下面--我已经理解了您所说的内容(以前我不清楚)。也不起作用,它输出的错误与上面的解决方案相同,““64x12”、“64x184”、“64x64”.... 这是我得到的输出,而不是…“64x12”、“64x64”、“64x184:[“192x192”、“292x192”、“32x32”、“64x12”、“64x64”、“64x84”、“96x96”]。如果这不是你得到的,我不知道发生了什么-你重新编译了吗?是的,我的错。将“sort”改为“sortBy(比较readAsInt)”更简洁。“比较”来自数据。Ord。。。和“readAsInt[x,y]=(read x::Int,read y::Int)”作为结果
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"]