Forum Webscript.Ru

Программирование => Perl => Тема начата: Error202 от 19 Ноября 2008, 16:06:19

Название: Сортировка нескольких массивов
Отправлено: Error202 от 19 Ноября 2008, 16:06:19
Здрасте...

Есть 4 массива

@aa: (\'3\',\'2\',\'1\',\'4\')
@bb: (\'a\',\'b\',\'d\',\'c\')
@cc: (\'xx\',\'xx\',\'xx\',\'xx\')
@dd: (\'xx\',\'xx\',\'xx\',\'xx\')

Как можно их сортирнуть так, чтобы, допустим, при
$i == 1
Сортировалось все по первому массиву
Результат:
1,2,3,4
d,b,a,c
xx,xx...

$i == 2
Сортировалось все по второму массиву
Результат:
3,2,4,1
a,b,c,d
xx,xx...

и т.д. ?
Название: Сортировка нескольких массивов
Отправлено: APL от 19 Ноября 2008, 16:54:58
боюсь что только вручную сортировать так можно... и руками же менять значения типа $aa[$n1] на $aa[$n2] и т.п.
Название: Сортировка нескольких массивов
Отправлено: Error202 от 19 Ноября 2008, 16:58:28
Жаль... Код с PHP перевожу... Там это одной процедуркой делается :(
Название: Сортировка нескольких массивов
Отправлено: ravshaniy от 19 Ноября 2008, 23:50:17
вот два варианта, наверное есть еще, либо эти можно оптимизировать
my (@aa, @bb, @cc, @dd);
@aa = (\'3\',\'2\',\'1\',\'4\');
@bb = (\'a\',\'b\',\'d\',\'c\') ;
@cc = (\'xx\',\'xx\',\'xx\',\'xx\');
@dd = (\'xx\',\'xx\',\'xx\',\'xx\') ;

sub sortByFirstArray (\\@\\@; ){
    my ($a1, $a2) = @_;
    my (%a, @a);
    for $i (0..$#$a1){
        $a{$$a1[$i]} = $$a2[$i];
    }
    $i=0;
    for $k ( sort (keys %a) ){
        $a[$i]=$a{$k};
        $i++;
    }
    return @a;
}
print sortByFirstArray(@aa, @bb);
print "\\n", sortByFirstArray(@bb, @aa);

sub sortByFirstArray2 (\\@\\@; ){
    my ($a1, $a2) = @_;
    my (%a, $b, @a, @r);
    for $i(0..$#$a1){
        $b = $$a1[$i];
        $a{$b} = $i;
    }
    @a = sort(@$a1);
    for $i (0..$#a){
   $b = $a[$i];
        $b = $a{$b};
        $r[$i]=$$a2[$b];
    }
    return @r;
}

print "\\n", sortByFirstArray2(@aa, @bb);

print "\\n", sortByFirstArray2(@bb, @aa);