[晒代码] 一个实际场景,欢迎各位晒下各种语言的实现~
2012-10-20 20:03:45 +08:00
paulguo
假设一个场景:
有如下结构的一个数组
[
{a: 5, b: 5},
{a: 6, b: 2},
{a: 2, b: 7},
{a: 5, b: 2},
{a: 1, b: 0},
{a: 5, b: 1},
{a: 6, b: 1},
{a: 2, b: 9}
]
要求按照a的降序优先排列,a相同的情况下,按照b的升序排列。
排序后的结果应当如下:
[
{"a": 6,"b": 1},
{"a": 6,"b": 2},
{"a": 5,"b": 1},
{"a": 5,"b": 2},
{"a": 5,"b": 5},
{"a": 2,"b": 7},
{"a": 2,"b": 9},
{"a": 1,"b": 0}
]
57 条回复
ylem
2012-10-30 07:22:11 +08:00
chisj
2012-10-30 12:28:24 +08:00
@
yinsigan 是的,那个block就是算法,单词确实要打很多,所以不可能用vim之类编辑器来写代码,用xcode的话会有很好的代码提醒,但是函数名不适合记忆。
当然有时候选择少了也是一种幸福啊。
plprapper
2012-10-30 17:46:08 +08:00
shell
sort -k2nr -k4n
egen
2012-10-30 18:34:30 +08:00
目测最易懂的是sql,最糟糕的是objc
andy12530
2012-10-30 19:08:34 +08:00
2L用原生函数,壮载我大JS
infinte
2012-10-30 19:37:08 +08:00
moescript
list.soty (x, y) => (x.a - y.a) or (x.b - y.b)
infinte
2012-10-30 19:37:24 +08:00
抱歉错个字……
jiyinyiyong
2012-10-30 19:40:11 +08:00
`a` 赋值了那个数组的话:
```livescript
a |> (.sort -> &0.b - &1.b) |> (.sort -> &1.a - &0.a) |> console.log
```
Cwind
2012-10-30 19:47:32 +08:00
objc声明array用新语法可以简洁点:
NSArray *array = @[@{@"a":@5,@"b":@5},@{@"a":@6,@"b":@2},...];
moonranger
2012-10-30 21:24:06 +08:00
来个Clojure版:
(def data
[{:a 5 :b 5}
{:a 6 :b 2}
{:a 2 :b 7}
{:a 5 :b 2}
{:a 1 :b 0}
{:a 5 :b 1}
{:a 6 :b 1}
{:a 2 :b 9}])
(println (sort-by #(+ (* -10 (:a %)) (:b %)) data))
moonranger
2012-10-30 21:25:47 +08:00
P.S. 向所有Java程序员推荐Clojure
powerx1202
2012-10-31 23:59:25 +08:00
在学haskell,写个naive的。。
List.sortBy (\x y -> let xa = fromJust $ Map.lookup 'a' x; xb = fromJust $ Map.lookup 'b' x; ya = fromJust $ Map.lookup 'a' y; yb = fromJust $ Map.lookup 'b' y in if xa == ya then xb `compare` yb else ya `compare` xa) ar
levn
2012-11-01 08:21:04 +08:00
@
powerx1202那我也写个……
sortThat = sortBy $ ((flip compare) `on` (! "a")) `mappend` (compare `on` (! "b"))
powerx1202
2012-11-01 20:35:37 +08:00
@
levn 哈,诱出高手了,我才刚看到monoid。。
hpyhacking
2012-11-01 22:09:22 +08:00
compare({_A, B1}, {_A, B2}) -> B2 > B1;
compare({A1, _B1}, {A2, _B2}) -> A1 > A2.
lists:sort(fun compare/2, List).
silverbullettt
2012-11-01 22:30:02 +08:00
没人用 Scheme?
(define lst (list (s 5 5) (s 6 2)
(s 2 7) (s 5 2) (s 1 0)
(s 5 1) (s 6 1) (s 2 9)))
(define-struct s (a b))
(sort lst
(lambda (x y)
(if (= (s-a x) (s-a y))
(< (s-b x) (s-b y))
(> (s-a x) (s-a y))))))
其实这是 Racket~
silverbullettt
2012-11-01 22:30:51 +08:00
我去,缩进被吃了
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/50485
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.