【发布时间】:2013-05-02 03:22:38
【问题描述】:
第二次更新:
我终于按照zurgl的建议写了something递归遍历和分组。感谢所有试图提供帮助的人!
第一次更新:
我希望可以是排序功能,但不确定,旨在优化随后的分组(最小化组数)。分组收集水平或垂直相邻的元组:
f xs =
foldr (\a@(y,x) ((b@(y',x'):xs):bs) -> if (y == y' && abs (x-x') == 1) ||
(x == x' && abs (y-y') == 1)
then (a:b:xs):bs
else [a]:(b:xs):bs)
[[last xs]] (init xs)
第二个例子的输出,在“排序”之后:
*Main> f [(0,1),(1,1),(2,1),(2,2),(2,3),(1,3),(0,3),(4,1),(4,2)]
[[(0,1),(1,1),(2,1),(2,2),(2,3),(1,3),(0,3)],[(4,1),(4,2)]]
--更新结束--
我在构思排序功能时遇到了麻烦,希望有人知道如何实现它,或者说是否需要比自定义排序更多的功能。我尝试过使用 sortBy,但似乎没有取得太大进展。
我如何从中得到:
[(0,1),(0,3),(1,1),(1,3),(2,0),(2,1),(2,3),(4,1),(4,2)]
到这里:
[(0,1),(1,1),(2,0),(2,1),(0,3),(1,3),(2,3),(4,1),(4,2)]
both y y' 和 x x' 之间的差异为 0 或 1 应该是主要的。这有意义吗?
第二个例子:
[(0,1),(0,3),(1,1),(1,3),(2,1),(2,2),(2,3),(4,1),(4,2)]
=>
[(0,1),(1,1),(2,1),(2,2),(2,3),(1,3),(0,3),(4,1),(4,2)]
【问题讨论】:
-
我不明白您所说的“y y' 和 x x' 之间的 0 或 1 的差异应该是主要的。”
-
是的,我也不明白。你能解释一下为什么应该例如(2,1) 在 (0,3) 之前?
-
不确定您描述的内容是否可以表示为排序,因为您不是简单地比较
(2,1)和(0,3),而是在另一个值(2,0)的上下文中进行比较。例如,给定[(0,0),(0,1),(0,2)],那和[(0, 2), (0, 1), (0, 0)]都是有效的。如果我误解了您的描述,请详细说明。 -
我已经投票结束:groovy 的两个(或三个,看看 Charles D 的回答)示例并不能解释他想要什么,并且试图猜测可能的配对顺序是在浪费每个人的时间.
-
你的意图很不明确。我可以推荐一个策略。首先,定义一个从对到表示排序的结果类型的转换函数,例如算术运算的数值结果。其次,将此函数与
sortWith一起使用对您的数据进行排序。
标签: haskell