首页 > 解决方案 > 如何对数组进行反向排序,排序从行尾开始

问题描述

我在 LDAP 数据库中有一堆地址,想删除一条街道。为此,我必须先拆除房屋。LDAP 数据库输出未排序

my @x1=("c=NL",
        "nr=1,s=Dam,a=AMS,c=NL",
        "s=Dam,a=AMS,c=NL",
        "a=AMS,c=NL",
        "nr=3,s=Plein,a=AMS,c=NL",
        "s=Plein,a=AMS,c=NL",
        "nr=2,s=Dam,a=AMS,c=NL"   );

在我们可以删除 's=Dam' 之前,我们必须先删除 'nr=1,s=Dam,a=AMS,c=NL' 和 "nr=2,s=Dam,a=AMS,c=NL",在我们删除“s=Dam,a=AMS,c=NL”之前

我选择的方向是从末端到前面对线条进行排序,所以首先是“c=NL”,然后是“a=AMS”,依此类推。如果它包含“s=Dam,a=AMS,c=NL”,则遍历该数组。

结果应该看起来像:

    'nr=2,s=Dam,a=AMS,c=NL'
    'nr=1,s=Dam,a=AMS,c=NL'
    's=Dam,a=AMS,c=NL'

我在代码中添加了 Data::Dumper 以显示发生了什么

    my @x1=("c=NL",
            "nr=1,s=Dam,a=AMS,c=NL",
            "s=Dam,a=AMS,c=NL",
            "a=AMS,c=NL",
            "nr=3,s=Plein,a=AMS,c=NL",
            "s=Plein,a=AMS,c=NL",
            "nr=2,s=Dam,a=AMS,c=NL"   );
    print Data::Dumper->Dump([\@x1],['*x1']);

    my @x2=split( "\n", reverse join ("\n", @x1));
    print Data::Dumper->Dump([\@x2],['*x2']);

    my @x3=sort @x2;
    print Data::Dumper->Dump([\@x3],['*x3']);

    my @x4=split( "\n", reverse join ("\n", @x3));
    print Data::Dumper->Dump([\@x4],['*x4']);

    foreach (@x4) {
      # if matches from the rear: "s=Dam,a=AMS,c=NL", do stuff
    }

这是结果

@x1 = (
        'c=NL',
        'nr=1,s=Dam,a=AMS,c=NL',
        's=Dam,a=AMS,c=NL',
        'a=AMS,c=NL',
        'nr=3,s=Plein,a=AMS,c=NL',
        's=Plein,a=AMS,c=NL',
        'nr=2,s=Dam,a=AMS,c=NL'
     ); @x2 = (
        'LN=c,SMA=a,maD=s,2=rn',
        'LN=c,SMA=a,nielP=s',
        'LN=c,SMA=a,nielP=s,3=rn',
        'LN=c,SMA=a',
        'LN=c,SMA=a,maD=s',
        'LN=c,SMA=a,maD=s,1=rn',
        'LN=c'
      ); @x3 = (
        'LN=c',
        'LN=c,SMA=a',
        'LN=c,SMA=a,maD=s',
        'LN=c,SMA=a,maD=s,1=rn',
        'LN=c,SMA=a,maD=s,2=rn',
        'LN=c,SMA=a,nielP=s',
        'LN=c,SMA=a,nielP=s,3=rn'
      ); @x4 = (
        'nr=3,s=Plein,a=AMS,c=NL',
        's=Plein,a=AMS,c=NL',
        'nr=2,s=Dam,a=AMS,c=NL',
        'nr=1,s=Dam,a=AMS,c=NL',
        's=Dam,a=AMS,c=NL',
        'a=AMS,c=NL',
        'c=NL'
      );

能否改进此代码,使代码更具可读性。

标签: arraysperlsortingldapreverse

解决方案


sub reverse_terms { join ',', reverse split /,/, $_[0] }

my @sorted =
   map reverse_terms($_),
   reverse sort
   map reverse_terms($_),
   @unsorted;

或者

use Sort::Key qw( rkeysort );

my @sorted = rkeysort { join ',', reverse split /,/ } @unsorted;

上述解决方案变换

s=Dam,a=AMS,c=NL
nr=1,s=Dam,a=AMS,c=NL

进入

c=NL,a=AMS,s=Dam
c=NL,a=AMS,s=Dam,nr=1

然后,他们按降序对转换后的字符串进行排序。这导致孩子出现在父母面前。

c=NL,a=AMS,s=Dam,nr=1
c=NL,a=AMS,s=Dam

最后,这只是将字符串转换回来(或返回原始字符串,在 的情况下rkeysort)的问题。


推荐阅读