配列の表示順をコントロールする方法とは?

このQ&Aのポイント
  • 配列の数が同じ場合、表示順序を意図した順番にすることは可能かを教えてください。
  • 配列の数の多い順に配列を表示し、その中で値の並びを別の配列を参考にして順番を決めたいです。
  • 配列の数が同じ場合でも、意図した順番になる方法として、Tie::IxHashモジュールを使用する方法があります。
回答を見る
  • ベストアンサー

ソート時同じ値がある場合、表示順をコントロールする事は可能ですか?

ハッシュの配列を配列の数の多い順に表示する場合で配列の数が同じの場合の最初に表示される配列の数字につきまして この配列の数が同じである場合の表示順序を意図した順番にする事は可能でございますか? この意図した順番と申しますのは、小さい数字を先に表示するのではなく下記の@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__;

  • taku0
  • お礼率80% (160/199)
  • Perl
  • 回答数2
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.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行目で出ている警告は消してません。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「2つのデータが期待した順序になっている」という条件をプログラムで書ければ全く問題なく可能です. sort が終わると, 隣り合うデータが「比較関数を満たす」ように並びますから.

関連するQ&A

  • 静的ハッシュの配列のキーに対応する値の数の多さ順で表示させたい

    ハッシュのキーに対応する値の数の多さ順で表示させたいと考え、下記の所まで試行錯誤しておりますが、どうにも思ったようにソートできずにおります。 #!/usr/bin/perl use strict; my(%a, $i, $j ,$allarray ,@keys ,@keys2 ,%hash ,%files ,$a_mumei_ref ,$key ,$value ,@value ,$x ,$files); # ハッシュの配列を静的に作る %a = ( '0' => [ qw(0) ], '1' => [ qw(1 1) ], '3' => [ qw(3 3 3) ], '7' => [ qw(7 7 7) ], '2' => [ qw(2) ], '4' => [ qw() ], '5' => [ qw() ], '6' => [ qw() ], '8' => [ qw(8 8) ], '9' => [ qw(9) ], ); @keys = sort { $hash{$b} <=> $hash{$a} || length($b) <=> length($a) || $a cmp $b } keys %a; #ハッシュのキーを数字順で表示 foreach (@keys){ print $_ ."\n"; } # 静的に作ったハッシュの配列を取り出してみる foreach $i (sort keys %a) { for ($j = 0; $j <= scalar(@{$a{$i}})-1; $j++) { print '$a{'. $i. '}['. $j. ']='. $a{$i}[$j]. ' '; } $allarray=scalar(@{$a{$i}})-1; print "No$i:kosuu:$allarray"; print "\n"; #配列の値の個数を調べその配列を作成 my($a_mumei) = $allarray; $a_mumei_ref = \$a_mumei; $files{"$i"}=($i,$a_mumei_ref); } #each関数で%filesの中身を表示 while ( ( $key , $value ) = each %files ){ print "key:$key value:$$value\n" ; } #試行錯誤 foreach $x (sort { $files{$b} <=> $files{$a} } keys %files){ print "$x => $files->{$x}\n"; } @keys2 = sort {$hash{$a} <=> $hash{$b}} keys %files; #@keys2 = sort { $hash{$b} <=> $hash{$a} || length($b) <=> length($a) || $a cmp $b } keys %files; #@keys2 = sort { $hash{$a} cmp $hash{$b} } keys %files; print "@keys2\n"; print "\n"; __END__; 私のイメージしておりますのは、ソートした結果がハッシュのキーに対応する値の数の多さ順で下記のように表示させたいのですが、 どのようにすれば可能でございますか、ご教授願えませんでしょうか key:3 value:2・・・この場合valueは配列の個数 key:7 value:2 key:8 value:1 key:1 value:1 key:9 value:0 key:2 value:0 key:0 value:0 key:6 value:-1 key:4 value:-1 key:5 value:-1

    • ベストアンサー
    • Perl
  • DBM::Deepでの配列がうまく動作しない

    DBM::Deepでの配列がうまく動作しない 普段よくgdbmを使うのですが、DBM::Deepを使うと配列も使える人のことで試しているのですが、 ちょっと動作がおかしいです。私が何か間違えているかもしれませんので、一度見ていただければと思います。 --------------------------------- use DBM::Deep; my @array; tie @array, "DBM::Deep", "bar.db" ; # ★3 @array=( [ "123" , "abc" ], [ "456" , "def" ], ); print qq($array[0][1]\n); # ★1 for my $ref(@array){ print "@$ref\n"; # ★2 } --------------------------------- 結果 --------------------------------- abc --------------------------------- これを実行してみますと、★1はちゃんと表示されるのですが、★2が何も表示しません。どうもループにも入りません。。 ここで試しに★3をコメントにしてみますと・・ --------------------------------- 結果 --------------------------------- abc 123 abc 456 def --------------------------------- これはどういう事なのでしょうか? DBM::Deepでは値の列挙ができない・・・のでしょうか。 それとも何か間違えていますでしょうか? どうぞよろしくお願いします。

    • ベストアンサー
    • Perl
  • 動的なハッシュの配列を作成したい

    #お世話になります。最終的には、下記のように配列の順番にハッシュを作成したいのですが、ご教授願えませんでしょうか #!/usr/bin/perl #想定される配列 @array=(0,2,4,6,8,1,3,5,7,9); #下記が最終的に動的に作成したいハッシュの形です。 %List = ( '0' => [ (@array0_n) ], '2' => [ (@array2_n) ], '4' => [ (@array4_n) ], '6' => [ (@array6_n) ], '8' => [ (@array8_n) ], '1' => [ (@array1_n) ], '3' => [ (@array3_n) ], '5' => [ (@array5_n) ], '7' => [ (@array7_n) ], '9' => [ (@array9_n) ], ); $a='array'; $n='_n'; foreach (@array){ #試行錯誤中... print "\@{${a}[$_]{$n}}=@{${a}[$_]{$n}}"; } __END__; お忙しいかとは存じますが、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • ハッシュに保存した配列を取得する方法

    ハッシュに保存した配列を取り出すサンプルを2ケース作成したのですがいずれもうまくいきませんでした。 1ケース目は「value=sample2」、2ケース目は「value=5」と表示されてしまいました。 いずれも@array2の内容が表示されることを期待していたのですがどのように修正すればよろしいでしょうか? my @array1 = (0, 1, 2, 3, 4); my @array2 = (5, 6, 7, 8, 9); # 1ケース目_ハッシュを使用 my %total = ( sample1 => @array1, sample2 => @array2 ); # 結果表示1 my @res = %total{sample2}; for (my $i = 0; $i < @res; $i++) { print 'value=' . $res[$1] . "\n"; } # 2ケース目_ハッシュのリファレンスを使用 my $total2 = { sample1 => @array1, sample2 => @array2 }; # 結果表示2 my @res2 = $total2->{sample2}; for (my $i = 0; $i < @res2; $i++) { print 'value=' . $res2[$1] . "\n"; }

    • ベストアンサー
    • Perl
  • [perl]サブルーチンに渡す値が配列でもスカラーでも同様に処理できるようにしたい

    &test( [ X ] , [ Y ]); X:配列またはスカラー Y:スカラー のような形でサブルーチンに渡し、Xが配列であってもスカラーであっても新しい配列にpushしたいのですが、どうしてよいのか分かりません。 具体的には $a = 100; @b = qw/1 2 3 4 5/; $c = 500; のとき、 &test($a, $c);なら @array = qw/100/; $scalar = 500; &test(@b, $c);なら @array = qw/1 2 3 4 5/; $scalar = 500; のようにしたいのです。 なお、&test($a, @b, $c);のように引数を三つにして送る方法は仲間に却下されてしまいました。 なるべく引数は二つの方向でお願いいたします。

    • ベストアンサー
    • Perl
  • submitでのデータの受け渡しについて

    submitにてデータを受け渡すときについての質問となります。 変数を一つ受け渡す場合はこのようにすればいいと思うのですが、 print start_form; print submit('abc'); print hidden( -name => 'sample', -value => $a ); print end_form; 2つ以上の変数を受け渡す時には、どのようにすれば良いのでしょうか。 my $a = "red"; my $b = "black"; my @ab = ($a, $b); print start_form; print submit('color'); print hidden( -name => 'sample', -value => @ab ); print end_form; ####################################### my ($a, $b) = param('sample'); print $a; print $b; というふうにすると、print $a;はredを表示してくれますが、 $bにはblackは入っておらず表示してくれません。 どのようにすれば、配列を渡して、変数2つを受け取ることができるのでしょうか?? ご回答よろしくお願い致します。

    • ベストアンサー
    • Perl
  • リファレンスについて。

    以下のperlスクリプトで、どちらも私には同じ結果をもたらすものだと 予想していたのですが、出力結果が異なってしまいます。 なぜ script1 ではエラーなしで動作するのに、script 2では エラーが出るのでしょうか。 $$xx が d になり、 $$yy が ARRAY(0x180c460) となる理由も わかりません。 稚拙な質問で申し訳ありませんが、どなたかよろしくお願いしますm(_ _)m ## script 1 とします。 my $xx = \qw(a b c d); print "$$xx \n"; # d と出力される print "xx is $$xx \n"; # xx is d と出力。 ## script 2 とします。 my @array = qw(a b c d); my $yy = \@array; print "$yy \n"; # ARRAY(0x180c460) と出力される。 print "yy is $$yy \n"; # Not a SCALAR reference at tryme.pl line 11. とエラーになる。

    • ベストアンサー
    • Perl
  • 配列の記述

    配列@arrayの中からある特定の順番の配列を取得したいです。 $array[1]の1について$nなどの変数を使いたいのですが、 []の中に変数をどう記述すればいいのでしょうか? $n=100; print "$array["."$n"."]"; print '$'."array["."$n"."]"; ???わからない???

  • perlで配列のポインタをdllに渡すには?

    Active Perlの最新版(x86)を使っています。 C言語側で、 //配列の先頭要素へのポインタと配列の要素数を渡すと、要素の平均を整数で返す関数 int avr(int *array,int kazu) { int value=0; for(int i=0;i<kazu;i++) { value+=*(array+i); } return value/kazu; } などと書いて、avr.dllとしてビルドしたものを(モジュール定義はdefファイルにて指定)、 use Win32::API; my $function = Win32::API->new("avr", "avr", "PN", "N"); @array=(1,2,3,4,5); $avr=$function->Call(\@array,5); print "Content-type: text/html\n\n"; print $avr; と使ってみたのですが、出力値が期待の「3」ではなく、-123343252とか435893497などの無茶苦茶な数値になってしまいます。 配列のポインタの渡し方が違うのかとは思いますが、どう書いたら良いのか分からない状況です。 一応、他のプログラムからこのdllを使うと、正常動作するようです。

    • ベストアンサー
    • Perl
  • fortran 途中まで考えたのですが。。。。

    エラトステネスのふるい(素数の倍数を除いていって残ったのが素数)で3桁の素数を求めて表示したいです。 私が考えたのは、 1・2~99までの数を素数かどうか調べて、素数を配列に入れていく 2・100~999まで素数の配列の中の数で割って、割り切れたらおしまい。割り切れなかったら表示していく ということです。 しかし下のプログラムではうまく素数配列ができていないようなのです。 ここまでかなり時間がかかったのでこのプログラムに手をいれて これ以外におかしくなるところもどこを直せばいいのか教えてくださるとうれしいです。 C C q223.f C PROGRAM q223 C IMPLICIT NONE C INTEGER N,i,K,s,l REAL a(99),b(99),c(99),X,Y C real M C a(1)=2 a(2)=3 l=2 C DO N=2,99,1 M=N**(0.5) S=M DO i=2,S,1 K=MOD(N,i) IF(K ==0)THEN exit ELSE IF(K /=0)THEN l=l+1 a(l)=N ENDIF ENDDO ENDDO C do N=100,999 do l=1,99 X=a(l) Y=N/X if(Y==0)then exit else if(Y/=0)then write(*,*)N end if end do end do c end よろしくおねがいします

専門家に質問してみよう