Sorting Perl6:按值排序散列并使用kv
我正在查看以下数据(JSON格式) 我试着按散列值排序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>
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
方法映射到值上。)@raiphsort(*.value)
返回一个序列,因此.kv
将返回$index,$element
而不是$element key,$element value
。您可以尝试将其转换回散列,例如sort(*.value).hash.kv
但是hash随机化会丢失排序。@ugexe Thx。我已经删除了我的虚假评论。所以你的答案是正确的。sort
返回一个Seq
。如果发票是散列,Seq
元素是对
s。然后块可以使用.key
和.value
。简单!经验教训:1我仍然没有学到“总是测试代码,没有异常”包括“总是”和“没有异常”这两个词。2哈希以随机顺序存储其键——“排序哈希”是一个矛盾修饰法。想想“排序对”相反.3sort
不会返回其发票的排序版本。它会以某种排序顺序返回该发票元素的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;
}