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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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 Perl6:按值排序散列并使用kv_Sorting_Hashmap_Comparator_Raku_Columnsorting - Fatal编程技术网

Sorting Perl6:按值排序散列并使用kv

Sorting Perl6:按值排序散列并使用kv,sorting,hashmap,comparator,raku,columnsorting,Sorting,Hashmap,Comparator,Raku,Columnsorting,我正在查看以下数据(JSON格式) 我试着按散列值排序 for %files.kv -> $key, $value { 提供所需的数据,但我希望对其进行排序。我试过20种不同的方法,但都不管用 for %files.sort.kv -> ($key, $value) { 及 它的灵感来自 一个接一个,但没有一个起作用:( 如何按值对该哈希进行排序?my%hash=:a,:b,:c; my %hash = :a<z>, :b<y>, :c<x>

我正在查看以下数据(JSON格式)

我试着按散列值排序

for %files.kv -> $key, $value {
提供所需的数据,但我希望对其进行排序。我试过20种不同的方法,但都不管用

for %files.sort.kv  -> ($key, $value) {

它的灵感来自 一个接一个,但没有一个起作用:(

如何按值对该哈希进行排序?

my%hash=:a,:b,:c;
my %hash = :a<z>, :b<y>, :c<x>;

for %hash.sort(*.value) {
    say $_.key;
    say $_.value;
}
对于%hash.sort(*.value){ 说$\ key; 比如说$\价值; }
.kv
返回平坦序列

my%h=(
a=>3,
b=>2,
c=>1,
);
比如说%h.kv.perl;
#(“a”,3,“c”,1,“b”,2)
如果对其进行排序,则不会保留键及其关联值

说%h.kv.sort.perl;
#(1、2、3、“a”、“b”、“c”)。如下
因此,您希望在拆分对之前对其进行排序

#默认排序顺序(第一个键,第二个值)
说%h.sort.perl;
#(:a(3),:b(2),:c(1))。序号
假设%h.sort:.value;#仅按值排序(绑定值以随机顺序排列)
#(:c(1),:b(2),:a(3))。如下
假设%h.sort:.invert;#首先按值排序,然后按键排序
#(:c(1),:b(2),:a(3))。如下
说%h.sort:.kv.reverse;#首先按值排序,然后按键排序
#(:c(1),:b(2),:a(3))。如下

排序后,可以将其作为成对对象的序列:

#默认值$_
对于%h。排序:*。反转{
say.key~'=>'~.value
}
#提取为命名属性
对于%h.sort:.invert->(:$key,:$value){
说“$key=>$value”
}
#以上更明确的形式
对于%h.sort:.invert->Pair$(:key($key),:value($value)){
说“$key=>$value”
}
或者,您可以在排序后将这些对分开:
(请注意两层结构。)

说%h.sort(*.invert).map(*.kv.perl;
#(c),1.顺序,(b),2.顺序,(a),3.顺序
说%h.sort(*.invert)».kv.perl;
#(c),1.顺序,(b),2.顺序,(a),3.顺序
#违约$_
对于%h.sort(*.invert).map(*.kv){
say.key~'=>'~.value
}
#提取内部位置参数
对于%h.sort(*.invert).map(*.kv)->($k,$v){
说“$k=>$v”
}
#`».kv`而不是`.map(*.kv)`
对于%h.sort(*.invert)».kv->($k,$v){
说“$k=>$v”
}
您甚至可以在分离成对对象后将其展平

说%h.sort(*.invert).map(*.kv).flat.perl;
#(“c”,1,“b”,2,“a”,3)
说%h.sort(*.invert)».kv.flat.perl;
#(“c”,1,“b”,2,“a”,3)
对于%h.sort(*.invert).map(*.kv).flat->$k,$v{
说“$k=>$v”
}
对于%h.sort(*.invert)».kv.flat->$k,$v{
说“$k=>$v”
}
(注意,
».method
只映射一个方法调用。要映射两个方法调用,您需要
».method1».method2
,或者只使用map
.map(*.method1.method2)


因此,在上面的
».kv.flat
中,只有
.kv
方法映射到值上。)

@raiph
sort(*.value)
返回一个序列,因此
.kv
将返回
$index,$element
而不是
$element key,$element value
。您可以尝试将其转换回散列,例如
sort(*.value).hash.kv
但是hash随机化会丢失排序。@ugexe Thx。我已经删除了我的虚假评论。所以你的答案是正确的。
sort
返回一个
Seq
。如果发票是散列,
Seq
元素是
s。然后块可以使用
.key
.value
。简单!经验教训:1我仍然没有学到“总是测试代码,没有异常”包括“总是”和“没有异常”这两个词。2哈希以随机顺序存储其键——“排序哈希”是一个矛盾修饰法。想想“排序对”相反.3
sort
不会返回其发票的排序版本。它会以某种排序顺序返回该发票元素的
Seq
。我知道这只是一个示例,但只需注意其他选项—而不是
说$.\key
可以只是
说.key
甚至是
说.key.say
`%files.sort(*.invert)».kv->($key,$value){`似乎对我来说效果最好。谢谢!
for %files.sort: *.value.kv  -> ($key, $value) {
my %hash = :a<z>, :b<y>, :c<x>;

for %hash.sort(*.value) {
    say $_.key;
    say $_.value;
}