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

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}
]
8389 次点击
所在节点    程序员
57 条回复
haxe
2012-10-22 00:20:26 +08:00
haxe语言实现...权当抛砖引玉,因为本语言排序上没有上面那么强大的原生api,所以手写一个比较函数。为了性能上考虑避免运行时类型检查,定义了这个数组中元素的结构体A,顺便还提供了代码提示功能为维护提供了便利。

typedef A = {
var a : Int;
var b : Int;
}
//代码实现
var arr = [ // type inference
{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}
];
arr.sort( function( x:A , y:A ):Int
{
if ( x.a > y.a )
return -1;
else if ( x.a == y.a )
if ( x.b > y.b)
return 1;
else if ( x.b == y.b )
return 0;
else
return -1;
else
return 1;
} );
clowwindy
2012-10-22 00:22:22 +08:00
既然出现了 SQL,那我贴两个有意思的:

C#
var result = list.OrderByDescending(x => x["a"]).ThenBy(x => x["b"]);

C# with Linq
var result = from i in list orderby i["a"] descending, i["b"] select i;


C# 这么有趣的语法特性可惜被微软给糟蹋了。
zz1956
2012-10-22 00:36:25 +08:00
@binux
写反了吧
sorted(the_list, key=lambda x: (-x['a'], x['b']))
cloudream
2012-10-22 03:42:21 +08:00
list.sortBy( x => ( -x("a"), x("b") ) )

Scala
dndx
2012-10-22 09:45:49 +08:00
C版本,也就20来行。
http://gist.github.com/3929214
chisj
2012-10-23 10:01:17 +08:00
http://gist.github.com/3929214

Object-c 除掉测试用例也就七行。
chisj
2012-10-23 10:03:21 +08:00
对不起,请无视上一条回复,第一次用Gist太兴奋复制错了。
http://gist.github.com/3936202
tioover
2012-10-23 10:09:11 +08:00
壮哉我大Python
jesse0628
2012-10-29 17:26:39 +08:00
来一段common lisp吧~

(sort lst #'> :key #'(lambda (x) (+ (* 10 (getf x :a)) (- 9 (getf x :b)))))
yinsigan
2012-10-29 17:41:20 +08:00
@chisj OMG,object-c要打那么多单词,吓死人啊
ylem
2012-10-30 06:09:38 +08:00
@yinsigan 不不,object-c 不吓人,那个只是声明一个array而已。
ylem
2012-10-30 06:11:36 +08:00
@chisj 另外,用两个NSSortDescriptor就可以了。

<script src="https://gist.github.com/3976878.js"> </script>
ylem
2012-10-30 06:12:25 +08:00
呃。。。不太会用gist。。。直接靠代码:

NSArray *arr = [NSArray arrayWithObjects:
[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:5], @"a", [NSNumber numberWithInt:5], @"b",nil],
[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:6], @"a", [NSNumber numberWithInt:2], @"b",nil],
[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:2], @"a", [NSNumber numberWithInt:7], @"b",nil],
[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:5], @"a", [NSNumber numberWithInt:2], @"b",nil],
[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:1], @"a", [NSNumber numberWithInt:0], @"b",nil],
[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:5], @"a", [NSNumber numberWithInt:1], @"b",nil],
[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:6], @"a", [NSNumber numberWithInt:1], @"b",nil],
[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:2], @"a", [NSNumber numberWithInt:9], @"b",nil],
nil];




NSSortDescriptor *ageDescriptor = [[NSSortDescriptor alloc] initWithKey:@"a" ascending:NO];
NSSortDescriptor *hireDateDescriptor = [[NSSortDescriptor alloc] initWithKey:@"b" ascending:YES];
NSArray *sortDescriptors = @[ageDescriptor, hireDateDescriptor];
NSArray *sortedArray = [arr sortedArrayUsingDescriptors:sortDescriptors];

NSLog(@"after sort the arr is:%@", sortedArray);
ylem
2012-10-30 06:29:56 +08:00
另,回复怎么插入html代码?
ylem
2012-10-30 06:33:30 +08:00
不好意思啊各位,呵呵,我再回复下,试试帖个代码。

https://gist.github.com/3976878
ylem
2012-10-30 06:33:52 +08:00
。。。。。
ylem
2012-10-30 06:35:19 +08:00
我错了,再原谅我一次。。。

https://gist.github.com/3976878.js
ylem
2012-10-30 06:40:57 +08:00
好吧。。大家继续。。。
lwjefSub
2012-10-30 06:56:41 +08:00
lwjefSub
2012-10-30 06:56:58 +08:00
去掉s

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

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

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

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

© 2021 V2EX