Perl - 尝试使用排序方法

时间:2015-04-22 16:02:32

标签: perl

我不知道确切的词,但这正是我在Perl中想要实现的目标。

我有一个名为$var

的变量
my $var = "10 60 20 70 30 60 30 50 50 40 40 30 40 20 50 10 60";

这是一个动态值。目前我预定它只是为了让它易于理解。

然后我拆分$var

my $var1 (split //, $var);

从这一点来说,我不知道我在说什么。

我想像这样排序$var1

30 40 50 10 20 30 40 50 60 10 20 30 40 50 60 70

有没有办法实现这个结果?

我尝试过研究排序,但我发现的结果都没有涵盖这个问题。通常,如果我使用他们的方法,我会得到10 20 30 ......依此类推。

2 个答案:

答案 0 :(得分:4)

我能提出的最佳问题是你需要一个列表层次结构 - 每个列表都包含序列中下一个列表中的所有重复项。但是输入中有三次60,输出中只有两次。

此解决方案的工作原理是将每个值推送到@groups的第一个尚未包含该值的元素。放置所有项目后,数组将反转,每个子数组按数字顺序排序

use strict;
use warnings;

use List::Util 'any';

my $var = "10 60 20 70 30 60 30 50 50 40 40 30 40 20 50 10 60";

my @var = split ' ', $var;

my @groups;

for my $item ( @var ) {
  my $i = 0;
  ++$i while any { $item == $_ } @{ $groups[$i] };
  push @{ $groups[$i] }, $item;
}

@groups = map [ sort { $a <=> $b } @$_ ], reverse @groups;

use Data::Dump;
dd \@groups;

<强>输出

[
  [30, 40, 50, 60],
  [10, 20, 30, 40, 50, 60],
  [10, 20, 30, 40, 50, 60, 70],
]

答案 1 :(得分:0)

也许你想在箱子中加入相等的值并对箱子进行分类。

1 1
2 2
3 3
4
5
6

然后,您将从最右边的列到最左边的列读取答案列。尝试更多示例并告诉我们。