Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 哈希对排序_Sorting_Hashmap_Raku - Fatal编程技术网

Sorting 哈希对排序

Sorting 哈希对排序,sorting,hashmap,raku,Sorting,Hashmap,Raku,%hash.sort({.key})>.kv是否等同于上述排序 为什么在没有hyper>>提示的情况下此排序不起作用?该方法将返回一个of 因为调用列表会返回一个索引列表,所以对列表进行配对,这是您不想要的;你不能只是打电话。因此,您必须通过对每个对象调用.kv方法,分别从列表中的对象中取出键和值,而>.kv就是这样做的 你也可以用它来代替 >.kv语法允许实现将工作分散到多个线程上(如果这样做有意义)。 (目前Rakudo只是以半随机的顺序进行工作,以防止人们错误地使用该功能) 还有一种编写

%hash.sort({.key})>.kv
是否等同于上述排序

为什么在没有hyper
>>
提示的情况下此排序不起作用?

该方法将返回一个of

因为调用列表会返回一个
索引列表,所以对
列表进行配对,这是您不想要的;你不能只是打电话。因此,您必须通过对每个对象调用
.kv
方法,分别从列表中的对象中取出键和值,而
>.kv
就是这样做的

你也可以用它来代替

>.kv
语法允许实现将工作分散到多个线程上(如果这样做有意义)。
(目前Rakudo只是以半随机的顺序进行工作,以防止人们错误地使用该功能)


还有一种编写循环的替代方法,即使用子签名中的副词提取属性:

%hash.sort->(:$key,:$value)的
{
说“'$key'=>“$value'”;
}
对于%hash.sort->$对(:$key,:$value){
比如说$pair;
假设$key==$pair.key和$value==$pair.value;#True␤
}
#:$key是:key($key)的缩写
对于%hash.sort->(:key($k),:value($v)){
说“$k”=>“$v”;
}
这对于其他没有创建其公共属性列表方法的对象很有用

类C{has$.a;has$.b;has$.C;has$!private value}
我的$c=5;
我的$obj=C.new(:a,是的,这基本上是一样的,因为这里接受任何东西

我想指出的是,你甚至不需要给它提供一个论点,因为它的默认值比你给它的更聪明

Perl 6有许多创建和访问东西的方法。因此,以下任何一种方法都可以工作:

*.key
{.key}{${.key}
->${.key}#基本上是前一行的内容
{$^placeholder-var.key}
sub($){.key}
&a-subroutine-reference#您必须创建子例程
另外,由于所有的普通运算符实际上都是子程序,所以您可以在需要的其他地方使用它们。(不过,我想不出一个在该位置工作的运算符)

&infix:#负责数字加法运算符的子例程
&[+]#同上
&前缀:
&后缀:
#等

就我所见,这两个版本之间的唯一区别是使用了带有隐式
$参数的块,而不是使用任何星号,因此它们实际上是等效的

这是Perl,所以有不止一种方法:

my %hash =
    two   => 2,
    three => 3,
    one   => 1,
;

for %hash.sort(*.key)>>.kv -> ($key, $value) {
    say "'$key' => '$value'";
}
为什么在没有hyper
>>
提示的情况下,此排序不起作用

sort
将哈希强制为对列表,这就是您将得到的结果:

*.key
{ .key }
{ $^arg.key }
-> $arg { $arg.key }
要消除这些对,您需要在列表上迭代并对每个对调用
.kv

say %hash.sort(*.key).perl;
# ("one" => "1", "three" => "3", "two" => "2")
您可以在调用
.kv
之前强制执行
散列

say %hash.sort(*.key)>>.kv.perl;
# (("one", "1"), ("three", "3"), ("two", "2"))

say %hash.sort(*.key).map(*.kv).perl;
# (("one", "1"), ("three", "3"), ("two", "2"))
但这当然会破坏练习的目的,因为不能依赖散列排序

您可能已经注意到,根据您编写代码的具体方式,您将得到不同的结果。如果没有尾随的
.list
,那么您得到的实际上是一个
包裹
,而不是
列表
,但语义尚未最终确定

请注意,尽管返回的对象都可能带有简单的括号,但有些是地块,有些是列表,您可以通过调用
.WHAT
进行检查。这仍然是一项正在进行的工作

还要注意其中一些变体中的内圆括号,您可以通过调用
.flat
来摆脱它。如果这样做,您可以使用
->$key,$value
作为for循环的签名,而不是
->($key,$value)
(或者更明确地说,
->$anon($key,$value)
)它使用签名绑定来打开包裹

您可以使用相同的方法来解压成对对象,而不是使用
.kv

say %hash.sort(*.key).hash.kv.perl;
# ("one", "1", "three", "3", "two", "2")

for
不再扁平化了,这是最近的一个变化。在今天早上我刚用rakudobrew从nom构建的版本上,运行以下命令:
perl6-e'my%h=one=>1,two=>2,two=>3;对于%h.sort(*.key)>.kv{.say}'
生成:
one1␤三三␤两个2␤。我现在在freenode.net上,这是讨论更改的地方。@BradGilbert:已修复;我偶尔阅读日志,事实上还记得一些关于这方面的自行车赛,几周内没有跟踪perl6的开发,一切都会在背后发生变化;让我们希望答案最终符合当前语义……问题n坐了好几个小时,就在我最后敲定答案的时候,你过来加了一个完美的答案!但别担心,无论如何,请投赞成票;)@Christoph我也在想同样的事情。好吧,不完全一样,但还是一样。(我本来打算等着看哪一个先得票/最多,然后再投票给你的,但现在我看不出等待的意义。)
for %hash.sort(*.key) -> (:$key, :$value) {
    say "'$key' => '$value'";
}