我希望对字符串数组进行排序,以便字符串按以下顺序排列:
@set = ('oneM', 'twoM', 'threeM', 'sixM', 'oneY', 'twoY', 'oldest');
正如您可能注意到的那样,这些代表时间段,因此oneM
是第一个月等等。我的问题是我想按时间段排序,但是因为它们是我不能只是使用'sort',所以我创建了这个哈希来表达字符串的排序方式:
my %comparison = (
oneM => 1,
twoM => 2,
threeM => 3,
sixM => 6,
oneY => 12,
twoY => 24,
oldest => 25,
);
我希望能让我的生活更轻松,我可以做一些事情,比如:
foreach my $s (@set) {
foreach my $k (%comparison) {
if ($s eq $k) {
something something something
我感觉这是一种漫长的做事方式,我不确定如果我找到相同的东西后我会如何对它进行排序......我想我错过了自己的方式绘制一点所以任何帮助将不胜感激
根据要求,预期输出将如上所示在@set中显示。我应该已经提到@set中的值将是该集合的一部分,但不一定是所有这些值而不是相同的顺序。
答案 0 :(得分:5)
给出一个输入的例子,你期望的结果会有所帮助。我想这就是你要找的东西:
my @data = ( ... );
my %comparison = (
oneM => 1, twoM => 2, threeM => 3,
sixM => 6, oneY => 12, twoY => 24,
oldest => 25,
);
my @sorted = sort { $comparison{$a} <=> $comaprison{$b} } @data;
perlfunc手册页中的sort
函数文档中有很多示例。 (“perldoc -f sort”)
答案 1 :(得分:5)
您在预先计算数据时选择了良好的策略,以便于排序。您可以在排序本身内部计算此数据,但每次sort
需要比较值时,您都会浪费时间进行重新计算,这会在整个过程中多次发生。另一方面,缓存的缺点显然是你需要额外的内存来存储它,它可能会在内存不足的情况下降低你的排序速度,尽管整体计算量较少。
使用您当前的设置排序非常简单:
my @sorted = sort { $comparison{$a} <=> $comaprison{$b} } @set;
如果你想以牺牲CPU为代价来节省内存,那就是:
my @sorted = sort { calculate_integer_based_on_input{$a} <=> calculate_integer_based_on_input{$b} } @set;
使用单独的calculate_integer_based_on_input
函数,可以将oneY
等转换为12
或其他相应的值,或者只是将输入内联转换为适合排序的内容。
您可能还想查看使用缓存计算进行排序的常用习惯用法,例如Schwartzian transform和Guttman Rosler Transform。