電子書籍の厳選無料作品が豊富!

ハッシュの配列を配列の数の多い順に表示する場合で配列の数が同じの場合の最初に表示される配列の数字につきまして
この配列の数が同じである場合の表示順序を意図した順番にする事は可能でございますか?
この意図した順番と申しますのは、小さい数字を先に表示するのではなく下記の@array2の配列値の並んでいる順や別途配列に0~9の数字を適当に入れておきにそれを参考に評価するという形を希望しており模索中なのですが、まずこの事につきまして可能か不可能かをご教授願いたいのと、もし可能でしたらどうか解決に至る先輩方のお知恵をお借り出来ませんでしょうか
よろしくお願い致します。
#!/usr/bin/perl

use Tie::IxHash;

@array0_n=('a','b','c','d');
@array1_n=('e','f','g');
@array2_n=('h','i');
@array3_n=('j');
@array4_n=();
@array5_n=();
@array6_n=('k');
@array7_n=('l','n');
@array8_n=('m','o','p');
@array9_n=('q','r','s','t');

%array1 = (
'0' => [ (@array0_n) ],
'1' => [ (@array1_n) ],
'2' => [ (@array2_n) ],
'3' => [ (@array3_n) ],
'4' => [ (@array4_n) ],
'5' => [ (@array5_n) ],
'6' => [ (@array6_n) ],
'7' => [ (@array7_n) ],
'8' => [ (@array8_n) ],
'9' => [ (@array9_n) ], );

#配列の数の多い順に並び替え
my @array2 =reverse sort { scalar @{$array1{$b}} <=> scalar @{$array1{$a}} or $a <=> $b } keys %array1;

@array9_n2=('a2','b2','c2','d2');
@array1_n2=('e2','f2','g2');
@array2_n2=('h2','i2');
@array3_n2=('j2');
@array4_n2=();
@array5_n2=();
@array6_n2=('k2');
@array7_n2=('l2','n2');
@array8_n2=('m2','o2','p2');
@array0_n2=('q2','r2','s2','t2');

tie %TmpList, 'Tie::IxHash';
#@array2を元に更に動的にハッシュ内に配列を作成
foreach(@array2){
my $x="array$_\_n2";
$TmpList{$_}=[(@$x)];
print "$_,$#{$x},@$x<br>\n";
}
print "1-end\n";

while ( ( $key , $value ) = each %TmpList ){
print "key:$key value:@$value\n" ;
}
print "2-end\n";

my @array3 = sort { scalar @{$TmpList{$b}} <=> scalar @{$TmpList{$a}} or $a <=> $b } keys %TmpList;
#Tie::IxHashモジュールで表示する際の順番を固定出来るかテスト
foreach(@array3){
my $x="array$_\_n2";
$TmpList2{$_}=[(@$x)];
print "$_,$#{$x},@$x<br>\n";
}
print "3-end\n";
__END__;

A 回答 (2件)

わけの分からない連番のついた変数を使ってるとか、シンボリックリファレンスを使っているとか


突っ込みたいところはあるんですがそれはおいといて、
配列の要素数が同じな場合は先頭の文字コードの大小で決めると言うパターンを例にすると
こんな感じになります。

あと
>ハッシュの配列
配列のハッシュ、ですよね。


#!/usr/bin/perl

use strict;
use warnings;
use feature ':5.10';

no strict 'refs';

my @array0_n = qw(a b c d);
my @array1_n = qw(e f g);
my @array2_n = qw(h i);
my @array3_n = qw(j);
my @array4_n = ();
my @array5_n = ();
my @array6_n = qw(k);
my @array7_n = qw(l n);
my @array8_n = qw(m o p);
my @array9_n = qw(q r s t);

my %array1 = (
0 => [ @array0_n ],
1 => [ @array1_n ],
2 => [ @array2_n ],
3 => [ @array3_n ],
4 => [ @array4_n ],
5 => [ @array5_n ],
6 => [ @array6_n ],
7 => [ @array7_n ],
8 => [ @array8_n ],
9 => [ @array9_n ], );


#配列の要素数の多い順にソート。要素数が等しいときは先頭の文字で決定
my @array2 = sort { scalar @{$array1{$b}} <=> scalar @{$array1{$a}}
or
$array1{$b}[0] cmp $array1{$a}[0] }
keys %array1;

our @array9_n2 = qw(a2 b2 c2 d2);
our @array1_n2 = qw(e2 f2 g2);
our @array2_n2 = qw(h2 i2);
our @array3_n2 = qw(j2);
our @array4_n2 = ();
our @array5_n2 = ();
our @array6_n2 = qw(k2);
our @array7_n2 = qw(l2 n2);
our @array8_n2 = qw(m2 o2 p2);
our @array0_n2 = qw(q2 r2 s2 t2);

foreach (@array2){
my $x = "array${_}_n2";
say "$_, $#{$x}, @$x<br>";
}

say '######';

my @ary_of_ary = (
\@array0_n2,
\@array1_n2,
\@array2_n2,
\@array3_n2,
\@array4_n2,
\@array5_n2,
\@array6_n2,
\@array7_n2,
\@array8_n2,
\@array9_n2,
);

foreach (@array2){
say "$_, $#{$ary_of_ary[$_]}, @{$ary_of_ary[$_]}<br>";
}

perl okw.pl
Use of uninitialized value in string comparison (cmp) at okw.pl line 34.
Use of uninitialized value in string comparison (cmp) at okw.pl line 34.
9, 3, a2 b2 c2 d2<br>
0, 3, q2 r2 s2 t2<br>
8, 2, m2 o2 p2<br>
1, 2, e2 f2 g2<br>
7, 1, l2 n2<br>
2, 1, h2 i2<br>
6, 0, k2<br>
3, 0, j2<br>
4, -1, <br>
5, -1, <br>
######
9, 3, a2 b2 c2 d2<br>
0, 3, q2 r2 s2 t2<br>
8, 2, m2 o2 p2<br>
1, 2, e2 f2 g2<br>
7, 1, l2 n2<br>
2, 1, h2 i2<br>
6, 0, k2<br>
3, 0, j2<br>
4, -1, <br>
5, -1, <br>

面倒なので34行目で出ている警告は消してません。
    • good
    • 0

「2つのデータが期待した順序になっている」という条件をプログラムで書ければ全く問題なく可能です.


sort が終わると, 隣り合うデータが「比較関数を満たす」ように並びますから.
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!