dポイントプレゼントキャンペーン実施中!

ハッシュで重複するキーが値となるので、このハッシュはabdの3つのキーしか存在しないということでしょうか?
%a = ('a'=>1, 'b'=>2, 'a'=>3, 'd'=>4);

また、配列の場合はabadと4つ数になるということでしょうか?
@a = ('a','b','a','d');

この場合配列で、重複する値を抽出するアルゴリズムが知りたいです。

A 回答 (4件)

重複のチェックはこんな感じでいいでしょう。



@a = ('a', 'b', 'a', 'd');

for (@a) {
  if (defined $hash{$_}) {
    print $_, "が重複してます。\n";
    next;
  }
  $hash{$_} = 1;
}
    • good
    • 1

>この場合配列で、重複する値を抽出するアルゴリズムが知りたいです。



混乱するかも知れんが、重複チェックには
ハッシュ使うのが楽。

@a = ('a','b','a','d');

for($i=0;$i<=$#a;$i++){
 if($hash{$a[$i]}){
  print "$a[$i]は重複してます";
 }else{
  $hash{$a[$i]} = 1;
 }
}

あと、値がいくつか確認したければ
foreachとか使って
実際に見てみればよいかと。
    • good
    • 0

重複チェックは、こちらの方が良いのでは?



@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 "重複あり";
    }
  }
}
    • good
    • 0

 %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 "重複あり";
    }
  }
}

 とでもすればいいでしょう。
 (このロジックだと項目が増えたとき大変ですが(^_^;)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!