给定这些字符串的任意排序,如何对字符串数组进行排序?

时间:2012-09-12 10:51:57

标签: perl hash sorting

我希望对字符串数组进行排序,以便字符串按以下顺序排列:

@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中的值将是该集合的一部分,但不一定是所有这些值而不是相同的顺序。

2 个答案:

答案 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 transformGuttman Rosler Transform