- ベストアンサー
Perlでハッシュや配列で重複するキーについて
ハッシュで重複するキーが値となるので、このハッシュはabdの3つのキーしか存在しないということでしょうか? %a = ('a'=>1, 'b'=>2, 'a'=>3, 'd'=>4); また、配列の場合はabadと4つ数になるということでしょうか? @a = ('a','b','a','d'); この場合配列で、重複する値を抽出するアルゴリズムが知りたいです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
重複のチェックはこんな感じでいいでしょう。 @a = ('a', 'b', 'a', 'd'); for (@a) { if (defined $hash{$_}) { print $_, "が重複してます。\n"; next; } $hash{$_} = 1; }
その他の回答 (3)
- GuruGuru22
- ベストアンサー率51% (177/346)
>この場合配列で、重複する値を抽出するアルゴリズムが知りたいです。 混乱するかも知れんが、重複チェックには ハッシュ使うのが楽。 @a = ('a','b','a','d'); for($i=0;$i<=$#a;$i++){ if($hash{$a[$i]}){ print "$a[$i]は重複してます"; }else{ $hash{$a[$i]} = 1; } } あと、値がいくつか確認したければ foreachとか使って 実際に見てみればよいかと。
- mi-si
- ベストアンサー率35% (200/567)
重複チェックは、こちらの方が良いのでは? @a = ('a','b','a','d'); for ( $i = 0; $i < 4; $i++ ) { for ( $j = $i + 1; $j < 4; $j++ ) { if ( $a[$i] eq $a[$j] ) { print "重複あり"; } } }
%a に代入する以前に、for かなにかでチェックするしかありません。 上記の例題の場合、Perl の内部では下記のようなプログラムが動作します。 $a{a} = 1; $a{b} = 2; $a{a} = 3; $a{d} = 4; つまり、3行目が実行された段階で、$a{a} の中の値 1 は焼失してしまいます。 @a の場合は、4つの値が全て保存されます。 重複チェックは代入する以前に、 @a = ('a','b','a','d'); for ( $i = 0; $i < 4; $i++ ) { for ( $j = 0; $j < 4; $j++ ) { if ( $a[$i] eq $a[j] ) { print "重複あり"; } } } とでもすればいいでしょう。 (このロジックだと項目が増えたとき大変ですが(^_^;)