【问题标题】:How to sort an all-digit matrix in perl如何在perl中对全数字矩阵进行排序
【发布时间】:2015-03-04 16:04:46
【问题描述】:

假设有一个 m×n 全数字矩阵:

X11 X12 ... X1n<br>
X21 X22 ... X2n<br>
...<br>
Xmn Xmn ... Xmn 

我需要帮助来编写一个有点像 ansi sql 中的“order by”的方法。此方法应能够通过在 cmdline 中传入的任意数量的列索引对矩阵进行排序。

例如,如果 cmdline 是:

% myOrderby -col 1,2,5

它将按第 1、2 和 5 列对矩阵进行排序。

但是,如果 cmdline 是

% myOrderby -col 1,4,8,11

然后它将按第 1、4、8 和 11 列对矩阵进行排序。

如果要“排序”的最大列数是固定的,我知道如何实现该方法。我正在寻找一种可以根据任意列数对矩阵进行排序的方法。

这可能吗?

【问题讨论】:

    标签: perl sorting matrix sql-order-by


    【解决方案1】:

    您可以按任意数量的字段进行排序

    # note, your columns start at 1, while arrays index from 0
    my @cols = map($_-1, @param_cols);
    my @sorted = sort {
        my $r = 0;
        $r ||= $a->[$_] <=> $b->[$_] for @cols;
        return $r;
    } @matrix;
    

    【讨论】:

      【解决方案2】:

      您将遍历索引,当比较显示差异时退出循环。

      @M = map{$a=$_;map{$b=$_;map{$c=$_;map{$d=$_;
               map[$a,$b,$c,$d,$_],2,1}1,2}2,1}1,2}2,1;
      
      sub by_cols {
          my ($row1,$row2,@indices) = @_;
          foreach my $col (@indices) {
              my $d = $row1->[$col] <=> $row2->[$col];
              return $d if $d;
          }
          return 0;
      }
      
      print "@$_\n" for sort { by_cols($a,$b, 3,4,1) } @M;
      

      输出

      2 1 2 1 1
      2 1 1 1 1
      1 1 2 1 1
      1 1 1 1 1
      2 2 2 1 1
      2 2 1 1 1
      1 2 2 1 1
      1 2 1 1 1
      2 1 2 1 2
      2 1 1 1 2
      1 1 2 1 2
      1 1 1 1 2
      2 2 2 1 2
      2 2 1 1 2
      1 2 2 1 2
      1 2 1 1 2
      2 1 2 2 1
      2 1 1 2 1
      1 1 2 2 1
      1 1 1 2 1
      2 2 2 2 1
      2 2 1 2 1
      1 2 2 2 1
      1 2 1 2 1
      2 1 2 2 2
      2 1 1 2 2
      1 1 2 2 2
      1 1 1 2 2
      2 2 2 2 2
      2 2 1 2 2
      1 2 2 2 2
      1 2 1 2 2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-04
        • 1970-01-01
        • 2013-07-03
        • 1970-01-01
        • 2013-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多