In Map§

请参阅主要文档 in context 了解方法 sort

multi method sort(Map:D: --> Seq:D)

返回一个 SeqPair 对象,它们是哈希对,按键排序。等同于 %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(*@elems      --> Seq:D)
multi        sort(&custom-routine-to-use*@elems --> Seq:D)
multi method sort(List:D:      --> Seq:D)
multi method sort(List:D: &custom-routine-to-use  --> Seq:D)

按最小元素优先的顺序对列表进行排序。默认情况下,infix:<cmp> 用于比较列表元素。

如果提供了 &custom-routine-to-use,并且它接受两个参数,则会针对列表元素对调用它,并且应该返回 Order::LessOrder::SameOrder::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-47-120).sort;                  # OUTPUT: «(-4 -1 0 2 3 7)␤» 
say (3-47-120).sort: *.abs;           # OUTPUT: «(0 -1 2 3 -4 7)␤» 
say (3-47-120).sort: { $^b leg $^a }# OUTPUT: «(7 3 2 0 -4 -1)␤»

此外,如果 &custom-routine-to-use 返回一个 List,则元素将基于多个值进行排序,如果先前元素之间的比较结果为 Order::Same,则 List 中的后续值将用于打破平局。

my @resistance = (
    %first-name => 'Kyle',  last-name => 'Reese'  ),
    %first-name => 'Sarah'last-name => 'Connor' ),
    %first-name => 'John',  last-name => 'Connor' ),
);
.say for @resistance.sort: { .<last-name>.<first-name> };
 
#`(
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{.chars.Str} );
# OUTPUT: «(c bb aaa bbb ccc ddd)␤» 

在这种情况下,数组的元素按升序排列,首先按字符串长度(.chars)排列,如果长度完全相同,则按实际字母顺序(.Str)排列。

可以在此使用任意数量的条件

say <01 11 111 2 20 02>.sort{ .Int.comb.sum.Str } );
# 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:D: &custom-routine-to-use? --> Supply:D)

轻触其调用的 Supply。一旦该 Supply 发出 done,它发出的所有值都将被排序,并且结果按排序顺序在返回的 Supply 上发出。可以选择接受比较器 Block。如果原始 Supply quit,则异常将立即传达给返回的 Supply

my $s = Supply.from-list(41032);
my $t = $s.sort();
$t.tap(&say);           # OUTPUT: «2␤3␤4␤10␤»

任何§

在上下文中查看 方法 sort 的主要文档 in context

multi method sort()
multi method sort(&custom-routine-to-use)

使用 cmp 或给定的代码对象对可迭代对象进行排序,并返回一个新的 Seq。还可以将 Callable 作为位置参数,指定如何排序。

示例

say <b c a>.sort;                           # OUTPUT: «(a b c)␤» 
say 'bca'.comb.sort.join;                   # OUTPUT: «abc␤» 
say 'bca'.comb.sort({$^b cmp $^a}).join;    # OUTPUT: «cba␤» 
say '231'.comb.sort(&infix:«<=>»).join;     # OUTPUT: «123␤» 
 
sub by-character-count { $^a.chars <=> $^b.chars }
say <Let us impart what we have seen tonight unto young Hamlet>.sort(&by-character-count);
# OUTPUT: «(us we Let what have seen unto young impart Hamlet tonight)␤»