• ベストアンサー

配列要素の並べ替え

$Res[$i]という配列に、数字の要素が入っているんですが、それを昇順で並べ替えして要素の間に/を入れたいのですが、 foreach (sort {$a cmp $b} keys %Res) { $Res2 = $Res[$i] + "/" } どうもこの記述では上手くいかないので、どなたか教えて下さい!!

  • Perl
  • 回答数3
  • ありがとう数2

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

  • ベストアンサー
回答No.3

普通の配列が 0,1,2,3,...と、数字で要素を表すのに対し 名前(key)で表すのが、連想配列です。こんな風に表現します。 $person{'name'} 全体を示す場合は、'%'を使います。FORMで入力された値を受け取るのに、必須と言えるでしょう。 ご希望の内容を実現するには ↓ でOKです。下記の書籍にまんまっ、載ってます。 @Res2 = sort by_number @Res; sub by_number { if ($a < $b) { -1; } elsif ($a == $b) { 0; } elsif ($a > $b) { 1; } } "/"はこんなところで文字列演算しなくても、HTML(?)を吐き出す時に、付け加えればやればよろしい。 ===== お願い ===== まず、よい参考書を手元においてください(私もクドイね)。ほとんどのことは、それで解決します。 推奨は、「Learning Perl (邦訳:初めてのPerl)」通称ラクダ本。表紙のラクダの絵でスグに分かります。 もう一冊続編(?)で、「Programming Perl (邦訳:Perl プログラミング)」 どこの書店でもあると思います。 ==============

Kalen_F
質問者

お礼

今度こそ、思っている通りに出来ました!! 勉強しはじめて一ヶ月の、まだまだ初心者なので、とても謝々ですm(_ _)m 教えて頂いた本を片手に、もっと勉強してみようと思います!!(^^)

その他の回答 (2)

回答No.2

cmpは数値の比較ではなく文字列の比較です。 keys %Resでは、Resというハッシュ(配列ではない)のキー値のリストが得られてしまいます。(よって、おそらく空) sortした結果でforeachしても、$iなんていう変数には何も入りません。 $Res2 = join('/', sort {$a <=> $b} @Res); でしょうか。

Kalen_F
質問者

お礼

道理で、何も結果を得られなかったんですね。 確かに昇順で並べ替え出来ているようなのですが、 結果の$Res2をprintしてみても、何も表示されなかったんです(ーー;)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

質問タイトルからは只の配列の事についてのものと読み取れますが、 「%Res」を持ち出しているところを深読みして、連想配列についての事のように思えます。 しかし、「$Res[$i]」は@Resの要素にアクセスするものだから、やっぱり、只の配列の事かもしれない。 というところで、配列と連想配列の記述の仕方について、確認されてみては。 純粋に、 > $Res[$i]という配列に、数字の要素が入っているんですが、それを昇順で並べ替えして要素の間に/を入れたい という事なら、 @Res = (1,6,4,8,2); $Res2 = join( '/', sort @Res ); print $Res2, "\n";

Kalen_F
質問者

補足

初心者なので、連想配列というものが分かりません。 $Res[$i]という配列変数には、固定数値ではなく、条件によって動的な数値が格納されて、更に格納されている内容の数値の昇順で、配列の順を変えたいんです。

関連する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
  • Perl if 文内にforeachを入れる場合

    if ($pattern eq 'p2') { foreach $key (sort{ ($re_key{$b} <=> $re_key{$a}) || $b cmp $a } keys %re_key) { } else { foreach $key (sort{ ($b <=> $a) || $b cmp $a } keys %re_key) { } $pattern の選択で検索の種類を切り替えたいのですが、上のように指定するとコンパイルエラーになってしまいます。 foreach 文以降の処理は全く一緒なので、foreach 文の行だけ変更したいのですが、どうすれば良いですか?

  • 配列内の要素を元にソート

    配列内の要素を元に配列をソートしたいと考えております。 例) [0] => a,b,5 [1] => a,c,1 [2] => a,d,2 といった配列がある場合に [0] => a,c,1 [1] => a,d,2 [2] => a,b,5 と言った具合にソートは出来るのでしょうか? どなたかご存知の方、ご教授ください。 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • 配列の要素追加・・・

    プログラミングというものは結構やっていて最近Java・iアプリを作っているものです。 質問なんですが、プログラムが進行すると要素が増える~みたいなプログラムで ーーーーーーーーーー int[] a;//みたいな感じで起動。 ・・・ a[b]=0;//b番目の要素(int)をいきなり追加記述... ーーーーーーーーーー 上の様にするとエラーなようです。 配列の要素の追加について、あんまりいいサイトも見つからなかったので、教えてください。

    • ベストアンサー
    • Java
  • 配列の日付ソート処理2

    先ほど下記のような質問をしたのですが、、、 最初の配列の添え字を取得したい場合はどのようにしたらいいのでしょうか?? ksort($up_date, "cmp"); while (list ($key, $value) = each ($up_date)) { echo "$key: $value\n"; } function cmp ($a, $b) { if ($a == $b) return 0; return ($a > $b) ? -1 : 1; } としても、日付がうまく昇順されません。 この方法では駄目なのでしょうか?? ******************************************* 配列に下記のような日付が入ってます。 $array[0]=2004-11-01 14:20:10.412761+09; $array[1]=2004-11-28 19:09:42.898169+09; $array[2]=2004-11-26 17:16:10.531744+09; $array[3]=2004-11-30 20:25:39.622259+09; これをもっとも新しい日付の順序にしたいのですが、 これはやはり、バブルソートなどを作成する必要がでてきますでしょうか??? *********************************************

    • ベストアンサー
    • PHP
  • array_randで要素が数字の場合の処理方法

    PHPのarray_randについて教えて下さい。 下記のようなソースを作りましたが思った通りの結果になりません。 //(A) $test=array(3,5,8,11,14,24,26,28); print_r($test); foreach ($test as $val) { echo $val.'<br>'; } //(B) $keys = array_rand($test, 5);//決められた数を抽出 print_r($keys).'<br><br>'; foreach ($keys as $val) { echo $val.'<br>'; } Aの部分の結果は Array ( [0] => 3 [1] => 5 [2] => 8 [3] => 11 [4] => 14 [5] => 24 [6] => 26 [7] => 28 ) foreachの部分の出力↓ 3 5 8 11 14 24 26 28 となりこれは特に問題ありません。 Bの部分でAの配列から5つランダムで取り出したいのですが、結果は Array ( [0] => 0 [1] => 3 [2] => 5 [3] => 6 [4] => 7 ) 0 foreachの部分の出力↓ 0 3 5 6 7 となってしまい、Aの配列の添え字の中から5つの数字が選ばれるようになってしまいます。 Aの添え字ではなく「3,5,8,11,14,24,26,28」の数字から5つランダムで取り出すにはどのような書き方をすればよいのでしょうか? ご回答よろしくお願い致します。

    • ベストアンサー
    • PHP
  • 参照配列の要素数の求め方は?

    リファレンス配列の要素数は、$#では求められないのでしょうか? ------------------------------------- foreach $i(0 .. 3){ $hash->[$i] = $i * 100; } print "\%hashの要素数->$#hash\n"; $ref = \%hash; print "\%{$ref}の要素数->$#{$ref}\n"; -------------------------------------

    • ベストアンサー
    • Perl
  • 二つの配列をソートする

    (50,14) (20,15) (16.7,16) (0,17) (-1,18) (5,21) (33.3,22) (51,25) (52,26) (51,28) (51,27) を (52,26) (51,25) (51,27) (51,28) (50,14) (33.3,22) (20,15) (16.7,16) (5,21) (0,17) (-1, 18) のようにソートしたいのですが、有効なソートの方法がありましたら教えてください。左側の数字を配列A、右側を配列Bに入れてソートしたいです。

  • C言語で、配列の要素を削除したい

    構造体からなる配列において、 データを追加/削除したいのですが、 どうしたらいいのでしょうか? 学校の課題なのですが、問題から読み取る限り リスト構造じゃなくて配列でつくるみたいなのです。。 追加データ数は限られてるので、数はだいじょうぶと 思うのですが、データを消したあと その消した部分をどうやってつめればいいですか?? また、数字を追加/削除した後に数字のならびを ソートして昇順にそろえなければいけないのですが、 バブルソート法では遅いでしょうか? (それしか習ってないのですが) 何かもっと早くできる方法があれば教えていただきたいです。 どうかよろしくお願いします!

  • 配列の要素追加について

    配列Aがあり、その配列に別の要素を加えた配列Bを作成するためにはどのようにすればよいのでしょうか? Aをコピーしたものに要素を一つ加えてと考えたのですが。。。 つまり char[] a = {'a', 'b', 'c'}; char ch = 'd'; とあったときに、aにchを加えて char[] b = {'a', 'b', 'c', 'd'}; を作成したいです。 よろしくお願い致します。

    • ベストアンサー
    • Java

専門家に質問してみよう