sorting - Perl6 : Sorting Hash by Values and using kv

标签 sorting hashmap comparator raku columnsorting

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

{
  "FValidation_pipelineMTHXT_v4.5.1_refLibV2": "concordance2/f",
  "FValidation_pipelineLPJL": "concordance2/c",
  "FCompetenceRuns": "concordance2/b",
  "FWGS": "concordance2/a",
  "Falidation_pipelineMTHXT": "concordance2/e",
  "FValidation_pipelineLPJL_v4.5.1_refLibV2": "concordance2/d"
}

我正在尝试按哈希值排序
for %files.kv -> $key, $value {

提供所需的数据,但我希望对其进行排序。我尝试了大约20种不同的方法,这些方法不起作用
for %files.sort.kv  -> ($key, $value) {


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

灵感来自https://docs.perl6.org/routine/sort#(Map)_method_sort
并不断,但没有一个工作:(

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

最佳答案

.kv返回一个平面序列。

my %h = (
  a => 3,
  b => 2,
  c => 1,
);

say %h.kv.perl;
# ("a", 3, "c", 1, "b", 2).Seq

如果对它进行排序,则无需将键及其关联值保留下来就可以对它进行排序。

say %h.kv.sort.perl;
# (1, 2, 3, "a", "b", "c").Seq

因此,您需要先将其排序为,再将拆分成对。

# default sort order (key first, value second)
say %h.sort.perl;
# (:a(3), :b(2), :c(1)).Seq

say %h.sort: *.value;       # sort by value only (tied values are in random order)
# (:c(1), :b(2), :a(3)).Seq
say %h.sort: *.invert;      # sort by value first, key second
# (:c(1), :b(2), :a(3)).Seq
say %h.sort: *.kv.reverse;  # sort by value first, key second
# (:c(1), :b(2), :a(3)).Seq

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

# default $_
for %h.sort: *.invert {
  say .key ~ ' => ' ~ .value
}

# extract as named attributes
for %h.sort: *.invert -> (:$key, :$value) {
  say "$key => $value"
}

# more explicit form of above
for %h.sort: *.invert -> Pair $ (:key($key), :value($value)) {
  say "$key => $value"
}

或者,您可以在排序后将对分开:
(请注意两级结构。)

say %h.sort(*.invert).map(*.kv).perl;
# (("c", 1).Seq, ("b", 2).Seq, ("a", 3).Seq).Seq
say %h.sort(*.invert)».kv.perl;
# (("c", 1).Seq, ("b", 2).Seq, ("a", 3).Seq).Seq

# default $_
for %h.sort(*.invert).map(*.kv) {
  say .key ~ ' => ' ~ .value
}

# extract inner positional parameters
for %h.sort(*.invert).map(*.kv) -> ($k,$v) {
  say "$k => $v"
}

# `».kv` instead of `.map(*.kv)`
for %h.sort(*.invert)».kv -> ($k,$v) {
  say "$k => $v"
}

您甚至可以在拉开配对对象后将其展平。

say %h.sort(*.invert).map(*.kv).flat.perl;
# ("c", 1, "b", 2, "a", 3).Seq
say %h.sort(*.invert)».kv.flat.perl;
# ("c", 1, "b", 2, "a", 3).Seq

for %h.sort(*.invert).map(*.kv).flat -> $k, $v {
  say "$k => $v"
}

for %h.sort(*.invert)».kv.flat -> $k, $v {
  say "$k => $v"
}

(请注意».method仅映射一个方法调用。要映射两个方法,您需要».method1».method2,或仅使用map .map(*.method1.method2)即可。
因此,在上面的».kv.flat中,只有.kv方法映射到了值上。)

关于sorting - Perl6 : Sorting Hash by Values and using kv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56067089/

相关文章:

用于执行排序的 C 库函数

java - Java中遍历HashMap时如何保证key的顺序不被改变?

比较文件的 Bash 脚本

java - 使用一个 HashMap 作为另一个 HashMap 的键

ruby - Ruby 数组与哈希测试中的堆栈级别太深

ios - 启用 ARC 时,NSComparator 在对 NSArray 进行排序时更改行为

java - ASC 和 DESC 订单的自定义比较器实现

java - java中涉及多个对象的比较器实现

python - 使用字母字符串对列表进行排序

c++ - 使用排序函数和递归比较器对 boost 的 multi_array 进行排序