質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

3回答

5036閲覧

配列の中から重複した文字列を抽出する方法

yuki_90453

総合スコア326

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

1グッド

1クリップ

投稿2016/10/16 03:17

編集2016/10/16 04:52

いつもお世話になっております。

下記のように文字列で形成された配列の中から重複する文字列のみ抽出したいと考えております。

ruby

1["A", "B", "A", "C"]

###試した事
検索した下記のような方法を掲載されているページを良く見かけたのですが、こちらのの方法では中身が空になってしまいます。
対象の配列が数値では無く、文字列なのが原因だと思います。

ary.sort! ary.select.with_index{|e,i| e == ary[i+1] }

初歩的な内容ですが、どなたかアドバイスお願い致します。

###追記
こちらの実行環境に問題がありました。
下記の様に条件分岐でuniq!メソッドを使用してしまい、抽出したい値を削除していました。
条件分岐はaryの値を重複をチェックし、全て同じ値の場合。いくつか被る場合
全く被らない場合として分岐したいと考えております。

ruby

1if ary.uniq.length == 1 2#aryが全て同じ値の場合 3 4elsif ary.uniq! != nil 5#aryがいくつか被る場合 6#この部分で質問させて頂いた内容を書きます。 7 8elsif ary.uniq! == nil 9#aryが全く被らない場合 10 11end

そこで質問なんですが、条件分岐でuniqメソッドを使用してしまうと内容が上書きされてしまいますので、uniqメソッドを使用する前の状態に戻す方法を教えて頂けないでしょうか?
またはuniqメソッド以外で、重複を操作する適切なメソッドがあれば教えて頂けないでしょうか?

宜しくお願い致します。

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

uniqメソッドについての回答です。
uniq!メソッドは破壊的なメソッドではないため上書きしますが、uniqメソッドは上書きされません。
ですので、uniq!を使用しているところをuniqに変更したら良いと思います。

投稿2016/10/16 05:06

cameluby

総合スコア891

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki_90453

2016/10/16 06:13

ご返事が遅くなってしまい申し訳ございません。 なるほど、破壊的メソッドとはこの事を言うんですね。勉強になりました。 無事理想どおりの動きになりました。 ありがとうございます。
guest

0

以下のように一旦group_byでグループ化した後に配列の要素の数が1のもの(2以上ではない)を除外し、keyを取得することで、重複する値を取得できます。

ruby

1arr = ["A", "B", "A", "C"] 2 3# 文字列毎にグループ化する 4hash = arr.group_by{|i| i} 5 6hash 7#=> {"A"=>["A", "A"], "B"=>["B"], "C"=>["C"]} 8 9# 要素数が1のもの(重複していないということなので)を除外する 10new_hash = hash.reject{|k,v| v.one?} 11#=> {"A"=>["A", "A"]} 12 13# ここではkeyが取得したい値になっているので、`keys`で取得 14new_hash.keys 15#=> ["A"] 16 17# 短く書くとこうなります。 18arr.group_by{|i| i}.reject{|k,v| v.one?}.keys 19#=> ["A"]

投稿2016/10/16 03:57

編集2016/10/16 04:00
cameluby

総合スコア891

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki_90453

2016/10/16 04:45

cameluby 様 先日はありがとうございました。 今回も前回と同じようなミスを犯してしまい、実行環境に問題があったようです。 実行環境について再度、質問の内容を編集させて頂きます。
cameluby

2016/10/16 05:08 編集

プログラミングはそういう小さなミスがよくありますし、大丈夫ですよ! uniqについての回答を追加で行いました!
guest

0

こちらのの方法では中身が空になってしまいます。

お書きのスクリプトでちゃんと、["A"]がという結果になるので、実行の仕方が悪いのだと思います。

対象の配列が数値では無く、文字列なのが原因だと思います。

何故そう思ったのでしょうか?

ただ、お書きのスクリプトだと"A"が3つあったときに2つ表示されてしまいます。

Ruby

1案1: 2ary = ["A", "B", "A", "C", "A"] 3ary.sort! 4result = ary.select.with_index{|e,i| e == ary[i+1] }.uniq 5p result 6案2: 7ary = ["A", "B", "A", "C", "A"] 8result = ary.group_by(&:itself).values.reject{|x| x.count==1}.map{|x| x.first} 9# 同じ値の物をグループ化して、要素が1つの物を省く

投稿2016/10/16 04:18

otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki_90453

2016/10/16 04:43

ご返事ありがとうございます。 仰る通り私の実行環境に問題がありました。 下記の様に条件分岐でuniq!メソッドを使用してしまい、抽出したい値を削除していました。 条件分岐はaryの値を重複をチェックし、全て同じ値の場合。いくつか被る場合 全く被らない場合として分岐したいと考えております。 if ary.uniq.length == 1 #aryが全て同じ値の場合 elsif ary.uniq! != nil #aryがいくつか被る場合 #この部分で質問させて頂いた内容を書きます。 elsif ary.uniq! == nil #aryが全く被らない場合 end そこで質問なんですが、条件分岐でuniqメソッドを使用してしまうと内容が上書きされてしまいますので、uniqメソッドを使用する前の状態に戻す方法を教えて頂けないでしょうか?
otn

2016/10/16 05:26

> uniqメソッドを使用する前の状態に戻す方法を教えて頂けないでしょうか? uniq! ですよね。最小限の手直しで行くと、 elsfi ary.dup.uniq! != nil でしょうか。 あるいは、 elsif ary.uniq.length != ary.length #いくつかかぶる場合 else #全くかぶらない場合 end というのもあるかと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問