![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
ハッシュのキーに対応する値の数の多さ順で表示させたいと考え、下記の所まで試行錯誤しておりますが、どうにも思ったようにソートできずにおります。
#!/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
No.3ベストアンサー
- 回答日時:
この程度だと無意味だけど, シュワルツ変換
@sorted_keys = map { $_->[1]; } sort { $b->[0] <=> $a->[0] or $a->[1] <=> $b->[1]; } map { [ scalar @{$a{$_}}, $_ ]; } keys %a;
とか, 同系統でハッシュを 1つ余計に使って
my %tmp;
while (my ($key, $val) = each %a) {
$tmp{$key} = @{$a{$val}};
}
@sorted_keys = sort { $tmp{$b} <=> $tmp{$a} or $a <=> $b; } keys %a;
でもいいかな. (無名) 配列の長さごときに使うのはやりすぎな気もするけど.
$# と scalar では 1つだけ値がずれますね>#2. まあ, 一律ずれるので影響はないんですが.
これまた素晴らしいご回答をご教授頂きありがとうございます。
シュワルツ変数について調べてみたのですが、簡単そうで何だか難しいですね。
で、調べていたら「続・初めてのPerl」がヒットしたのですが、ハッと思ったんです。今、まさにちょうど図書館で借りてるじゃん!
で、試しに読むと、さかのぼってソートに関してから読み始めてみると、かなり分かりやすいですね。この調子で読み進めてゆきたいと思います。
借りても読まないと意味ないですが、今回の質問がそのきっかけになって良かったです。
多謝です。ありがとうございました。
No.4
- 回答日時:
#2様、
>ところで、配列の添字数を取得するのにscalarを使用しているみたい
>ですが、 @ を $# にするだけで取得できるのでは。
多分、スペースシップ演算子を使っている時点で、scalar は必要ありませんが、明示した方がわかりやすいと思ったまでです。
また、添字数を取得しているという意味ではありません。
No.1
- 回答日時:
こんにちは
こんな感じですか?
#! perl
use strict;
use Data::Dumper;
my %hash = ( '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) ], );
my @sorted_keys = sort { scalar @{$hash{$b}} <=> scalar @{$hash{$a}} or $a <=> $b } keys %hash;
print Dumper \@sorted_keys;
ご教授頂きありがとうございました。
Data::Dumperで表示させる事など思いもつきませんでした。
いや~素晴らしいです。
勉強になります。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- その他(プログラミング・Web制作) pythonにおける単方向リストの実装について 4 2022/07/13 12:34
- JavaScript Json のキーと値の出力の違いについて 2 2022/06/14 20:22
- Visual Basic(VBA) エクセルVBAについて 8 2022/07/13 22:41
- Visual Basic(VBA) シフト表のコマで「ブロック」されている前の時間の「出」を同一列の「休」と入れ替えたいがふぇきません。 2 2023/08/02 18:49
- JavaScript 電車の運賃を出すプログラムを作っています。 2 2022/06/22 09:36
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- JavaScript SQLでデータベースから返ったデータのJSON形式生成について 1 2022/04/06 12:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字列を変数名として扱う方法
-
動的なハッシュの配列を作成したい
-
ハッシュ検索はなぜ速い
-
まったく同じファイルのハッシ...
-
短いハッシュの作り方
-
ハッシュリストって単にハッシ...
-
データベースでユーザーのパス...
-
静的ハッシュの配列のキーに対...
-
画面を強制的に再描画させる方法
-
DoEventsが必要な理由について
-
VBのReturnの使い方
-
VBAのautofilter、criteriaの配...
-
VBAでの一時停止と再開の方法
-
アクティブセルから、A列最終行...
-
エクセル関数で1〜12の数字がル...
-
Do whileでExitせず、ループの...
-
vbscriptでIE自動入力(途中で...
-
「VC++6」ウィンドウの再描画
-
CSVファイルの特定の行だけを読...
-
delphi の 標準偏差のプログラ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ハッシュ検索はなぜ速い
-
文字列を変数名として扱う方法
-
チェックデジットについて
-
ハッシュのハッシュを実現したい。
-
まったく同じファイルのハッシ...
-
列挙型と連想配列の違いを教え...
-
重複ファイルを削除したいので...
-
*(アスタリスク)の意味
-
短いハッシュの作り方
-
英語でのシャープとコメの呼び...
-
ハッシュマーク以降のアドレス取得
-
一意(ユニーク)かつ、ソート...
-
Perlは戻り値で、ハッシュや配...
-
ハッシュリストって単にハッシ...
-
ActivePerl がハングアップ
-
多次元配列から重複を削除
-
mapのポインタ
-
Perlのハッシュ変数のソートに...
-
Perlのサブルーチンの引数に配...
-
文字数の短いユニークなID生成
おすすめ情報