[晒代码] 一个实际场景,欢迎各位晒下各种语言的实现~

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}
]
8422 次点击
所在节点    程序员
57 条回复
ipconfiger
2012-10-20 20:14:27 +08:00
python:

ls.sort(lambda x,y:cmp(x["a"]*10+x["b"],y["a"]*10+y["b"]))
paulguo
2012-10-20 20:15:42 +08:00
javascript:

arr.sort(function(x,y){return y.a-x.a||x.b-y.b});
fwee
2012-10-20 20:16:37 +08:00
a.sort{|a,b|r = b[:a] <=> a[:a]; r == 0 ? (a[:b] <=> b[:b]) : r}

顺便说下1L算法错了
ipconfiger
2012-10-20 20:23:08 +08:00
@fwee 哟西,没看到B生序
paulguo
2012-10-20 20:23:09 +08:00
1L 的确不对,LS什么语言?
fwee
2012-10-20 20:24:37 +08:00
3# Ruby 忘说了
clowwindy
2012-10-20 20:31:29 +08:00
coffee

arr.sort (x, y) -> y.a - x.a || x.b - y.b
imcotton
2012-10-20 20:47:17 +08:00
ActionScript 3

arr.sortOn(["a", "b"], [Array.NUMERIC | Array.DESCENDING, Array.NUMERIC])
binux
2012-10-20 20:49:00 +08:00
python:
sorted(the_list, key=lambda x: (x['a'], -x['b']))
mckelvin
2012-10-21 09:49:41 +08:00
ls真乃神人也
fwee
2012-10-21 10:19:16 +08:00
ruby

a.sort_by{|i| [-i[:a],i[:b]]}
这是最短的了吧
Keinez
2012-10-21 10:35:09 +08:00
9楼和11楼好棒!(咱外行居然也看懂了QAQ)
darkfall
2012-10-21 12:19:11 +08:00
C++11
std::sort(arr.begin(), arr.end(), [](Dict& a, Dict& b) -> bool {
return (a['a'] == b['a']) ? (a['b'] < b['b']) : (a['a'] > b['a']);
});
shiny
2012-10-21 13:31:38 +08:00
追求短小的话,PHP 可以是:
usort($items,function($a, $b){
return $a['a']==$b['a'] ? bccomp($a['b'],$b['b']) : bccomp($b['a'],$a['a']);
});

但是后面谁来维护这程序可能会骂了……
所以正常项目中我会这么写:

//兼容个别未开启 bcmath 的环境
if(!function_exists('bccomp')){
function bccomp($a,$b){
if($a==$b){
return 0;
} else if($a>$b){
return 1;
} else {
return -1;
}
}
}
function sort_items($a, $b){
if($b['a']==$a['a']){
return bccomp($a['b'],$b['b']);
} else {
return bccomp($b['a'],$a['a']);
}
}
luin
2012-10-21 13:38:58 +08:00
喜欢CoffeeScript,多易读啊
liuxurong
2012-10-21 15:20:06 +08:00
喜欢Python,多易读啊
insub
2012-10-21 22:07:21 +08:00
喜欢ruby,最易读了啊..........
alsotang
2012-10-21 23:06:24 +08:00
CoffeeScript +1
nowgoo
2012-10-21 23:30:03 +08:00
SQL:

SELECT a, b FROM t ORDER BY a DESC, b ASC;
blacktulip
2012-10-21 23:53:06 +08:00
看了半天还是SQL最易读,一看就懂

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/50485

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX