• ベストアンサー

Perlでハッシュや配列で重複するキーについて

ハッシュで重複するキーが値となるので、このハッシュはabdの3つのキーしか存在しないということでしょうか? %a = ('a'=>1, 'b'=>2, 'a'=>3, 'd'=>4); また、配列の場合はabadと4つ数になるということでしょうか? @a = ('a','b','a','d'); この場合配列で、重複する値を抽出するアルゴリズムが知りたいです。

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

  • ベストアンサー
  • HOGERA3
  • ベストアンサー率35% (50/139)
回答No.4

重複のチェックはこんな感じでいいでしょう。 @a = ('a', 'b', 'a', 'd'); for (@a) {   if (defined $hash{$_}) {     print $_, "が重複してます。\n";     next;   }   $hash{$_} = 1; }

その他の回答 (3)

回答No.3

>この場合配列で、重複する値を抽出するアルゴリズムが知りたいです。 混乱するかも知れんが、重複チェックには ハッシュ使うのが楽。 @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)
回答No.2

重複チェックは、こちらの方が良いのでは? @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 "重複あり";     }   } }

noname#25358
noname#25358
回答No.1

 %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 "重複あり";     }   } }  とでもすればいいでしょう。  (このロジックだと項目が増えたとき大変ですが(^_^;)

関連するQ&A