【问题标题】:How to display the special value always at top while sorting?排序时如何始终在顶部显示特殊值?
【发布时间】:2018-03-31 03:56:58
【问题描述】:

我使用下面的代码对值进行排序并在 Perl 表单页面中将其显示为下拉列表并且我需要始终在排序列表的顶部显示某个值,该怎么做?

 values= [sort {$a<=>$b and $orig->{$a} cmp $orig->{$b}} keys  %$orig] 

我也试过了,由于某种原因没有和我一起工作

values= [sort {if ($a eq 'somevalue') { return 1; }
elsif ($b eq 'somevalue') { return -1; }
else { return {$a<=>$b and $orig->{$a} cmp $orig->{$b}} keys  %$orig ;} }] 

有什么帮助吗?

【问题讨论】:

  • 所以$orig 的键是数字(与&lt;=&gt; 比较),值是字符串(与cmp 比较)?这并非不可信,但很不寻常。

标签: perl sorting hash-reference


【解决方案1】:

您可以使用(($b eq $special) - ($a eq $special)) 作为“sORt 链”中的第一个链接,将$special 值排序为最低:

my $special = "somevalue";
sort { (($b eq $special) - ($a eq $special)) || 
       $a<=>$b || $orig->{$a} cmp $orig->{$b} } keys  %$orig;

(($b eq $special) - ($a eq $special)) 返回:
0 当 $a 和 $b 是特殊的 [$a 等于 $b]
-1 当 $a 是特殊的并且 $b 不是 [$a 少大于 $b]
+1 当 $b 是特殊的且 $a 不是 [$a 大于 $b]
0 当 $a 和 $b 都不特殊时 [$a 等于 $ b]

当它产生 0 个 sORt 链中的下一个链接时,将被查询。

【讨论】:

  • 它几乎可以工作,但问题是它弄乱了我想要的排序顺序。 [sort{$a$b and $orig->{$a} cmp $orig->{$b}} keys %$orig ] 这是我想要的排序顺序,顶部有一些值。但是你的答案是使用 ASCII 排序在顶部给出某个值
  • 您能否提供带有您期望的排序输出的示例哈希?
【解决方案2】:

在排序前对第一个元素进行切片,而不是在显示前将其放回,比如

my @foo = ( header, 4, 5, 6 );
$bar = shift(@foo);

# sort it or do what you want

unshift(@foo,$bar);

print @foo, "\n";

【讨论】:

  • 如果我想显示哈希 ref 的第一个值,那会很好。不幸的是,我不知道我的值在什么位置或索引处。我只知道它的值,即, somevalue”,我正在以 feild bdw 的形式排序和打印,所以我不能在这里明确使用 print!
  • 哦。正如您所提到的,我确定您需要顶部的标题:“某些值始终位于排序列表的顶部”......我假设(错误地)它最初位于顶部。
  • 是的,我确实需要顶部的标题,甚至我都不知道它会在哪里..参考上面的答案,你认为你可以根据我的问题修改那个答案吗并为我提供一个可行的解决方案?
【解决方案3】:

假设你的哈希只包含非负键,你 可以对标头值进行排序,就好像它们是 -∞ 这将排在其他任何东西之前,但将等于 自己

sort {
    my ($aa, $bb) = map { $_ eq $special ? -Inf : $_ } $a, $b;
    $aa <=> $bb and $orig->{$aa} cmp $orig->{$bb};
} keys %$orig;

【讨论】:

    猜你喜欢
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    相关资源
    最近更新 更多