In Map§
请参阅主要文档 in context 了解方法 sort
multi method sort(Map: --> Seq)
返回一个 Seq
的 Pair
对象,它们是哈希对,按键排序。等同于 %hash.sort: *.key
# These are equivalent:say Map.new(<c 3 a 1 b 2>).sort; # OUTPUT: «(a => 1 b => 2 c => 3)»say Map.new(<c 3 a 1 b 2>).sort: *.key; # OUTPUT: «(a => 1 b => 2 c => 3)»
请参阅 Any.sort 了解其他可用候选者。
In List§
请参阅主要文档 in context 了解例程 sort
multi sort(* --> Seq)multi sort(, * --> Seq)multi method sort(List: --> Seq)multi method sort(List: --> Seq)
按最小元素优先的顺序对列表进行排序。默认情况下,infix:<cmp>
用于比较列表元素。
如果提供了 &custom-routine-to-use
,并且它接受两个参数,则会针对列表元素对调用它,并且应该返回 Order::Less
、Order::Same
或 Order::More
。
如果 &custom-routine-to-use
只接受一个参数,则会根据 custom-routine-to-use($a) cmp custom-routine-to-use($b)
对列表元素进行排序。&custom-routine-to-use
的返回值会被缓存,以便每个列表元素只调用一次 &custom-routine-to-use
。
示例
say (3, -4, 7, -1, 2, 0).sort; # OUTPUT: «(-4 -1 0 2 3 7)»say (3, -4, 7, -1, 2, 0).sort: *.abs; # OUTPUT: «(0 -1 2 3 -4 7)»say (3, -4, 7, -1, 2, 0).sort: ; # OUTPUT: «(7 3 2 0 -4 -1)»
此外,如果 &custom-routine-to-use
返回一个 List
,则元素将基于多个值进行排序,如果先前元素之间的比较结果为 Order::Same
,则 List
中的后续值将用于打破平局。
my = (%( first-name => 'Kyle', last-name => 'Reese' ),%( first-name => 'Sarah', last-name => 'Connor' ),%( first-name => 'John', last-name => 'Connor' ),);.say for .sort: ;#`(OUTPUT:{first-name => John, last-name => Connor}{first-name => Sarah, last-name => Connor}{first-name => Kyle, last-name => Reese})
此排序可以基于单个元素的特征
say <ddd aaa bbb bb ccc c>.sort( );# OUTPUT: «(c bb aaa bbb ccc ddd)»
在这种情况下,数组的元素按升序排列,首先按字符串长度(.chars
)排列,如果长度完全相同,则按实际字母顺序(.Str
)排列。
可以在此使用任意数量的条件
say <01 11 111 2 20 02>.sort( );# OUTPUT: «(01 02 2 11 20 111)»
从 Rakudo 编译器的 2022.07 版本开始,在没有任何参数的情况下调用 sort
子例程已成为运行时错误
sort; # ERROR: «Must specify something to sort»
从 Rakudo 编译器的 2023.08 版本开始,还可以指定 :k
命名参数。这将导致结果成为排序过程的索引列表。
say <a c b d e>.sort(:k); # OUTPUT: «(0 2 1 3 4)»say sort <a c b d e>, :k; # OUTPUT: «(0 2 1 3 4)»
In Supply§
请参阅主要文档 in context 了解方法 sort
method sort(Supply: ? --> Supply)
轻触其调用的 Supply
。一旦该 Supply
发出 done
,它发出的所有值都将被排序,并且结果按排序顺序在返回的 Supply
上发出。可以选择接受比较器 Block
。如果原始 Supply
quit
,则异常将立即传达给返回的 Supply
。
my = Supply.from-list(4, 10, 3, 2);my = .sort();.tap(); # OUTPUT: «23410»
任何§
在上下文中查看 方法 sort 的主要文档 in context
multi method sort()multi method sort()
使用 cmp 或给定的代码对象对可迭代对象进行排序,并返回一个新的 Seq
。还可以将 Callable
作为位置参数,指定如何排序。
示例
say <b c a>.sort; # OUTPUT: «(a b c)»say 'bca'.comb.sort.join; # OUTPUT: «abc»say 'bca'.comb.sort().join; # OUTPUT: «cba»say '231'.comb.sort(:«<=>»).join; # OUTPUT: «123»sub by-character-countsay <Let us impart what we have seen tonight unto young Hamlet>.sort();# OUTPUT: «(us we Let what have seen unto young impart Hamlet tonight)»