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

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

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

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

9回答

1284閲覧

「もしa,b,c,d全ての値が違うならば{何かしらのアクション}を起こす。ただし変数の値が""のものは除く」のような条件式が書きたい

KokiOya

総合スコア27

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

3クリップ

投稿2019/08/15 13:30

編集2019/08/16 16:33

Ruby on Railsを使ってWebサイトを製作中なのですが、以下のような条件の書き方がわかりません。

a = ランダムな文字列 b = ランダムな文字列(ただし""もあり) c = ランダムな文字列(ただし""もあり) d = ランダムな文字列(ただし""もあり) if a,b,c,d全てが違う値の時(ただし、値が""な変数は除く) 何かしらのアクション end

変数a,b,c,dを作ってそれぞれにランダムな値が入るのですが、その際に「もしa,b,c,d全ての値が違うならば{何かしらのアクション}を起こす。ただし変数の値が""のものは除く」のような条件式が書きたいです。
ご回答よろしくお願いします。

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

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

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

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

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

tatsu99

2019/08/15 15:54

すみません。 a="" b="" c="X" d="Y" のケースはアクションを起こすのでしょうか。 a="" b="" c="" d="Y" のケースもアクションを起こしますか?
KokiOya

2019/08/16 00:59

起こします!わかりにくくて申し訳ありません。
tatsu99

2019/08/16 12:03

すみません。すべて、""の場合は、どうなりますか。 a="" b="" c="" d="" の場合です。このケースが、回答者の間で問題になっています。
KokiOya

2019/08/16 16:32

軽く質問したつもりがそこまで考えてくださってありがとうございます。実はaには必ず何かしらの値が入るので""が入ることは無いようになっております。上記の質問も編集します。質問に間違いがありましたこと、大変申し訳ございません。
guest

回答9

0

ベストアンサー

ruby

1ary = [a,b,c,d].grep_v("") 2if !ary.uniq! 3 何かしらのアクション 4end

投稿2019/08/15 13:55

編集2019/08/16 11:36
asm

総合スコア15147

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

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

set0gut1

2019/08/15 14:02

uniq! の返り値にそんな使い方があったんですね。勉強になりました。
winterboum

2019/08/16 09:48

これですと、"" を含むときは期待と違ってしまいませんか? A B C "" のとき !nil && !true  となって、結果 false です
winterboum

2019/08/16 10:33

勘違い A B C "" は大丈夫ですね。 [[1, 2, 3, 4], [1, 2, 3, ""], [1, 2, 2, ""], [1, 2, "", ""]]. each{|a| ary=a.dup; p [a, (!ary.uniq! || !ary.include?(""))] } => [[1, 2, 3, 4], true] [[1, 2, 3, ""], true] [[1, 2, 2, ""], false] [[1, 2, "", ""], false] <= こいつが期待と違う
asm

2019/08/16 11:36

修正しました。
KokiOya

2019/08/16 17:02

この度はご回答ありがとうございます。非常にわかりやすく完結なコードでしたのでそのまま使わせてもらいました。本当にありがとうございました。またのご回答よろしくお願いします。
guest

0

Ruby は詳しくないですが…

a~d を配列にして、空文字列を除外して、ソートして
同じのが連続してなきゃokみたいな関数つくるのかなあ。

投稿2019/08/15 13:51

takasima20

総合スコア7458

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

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

takasima20

2019/08/15 15:31

あー、全部が空文字列だった時の結果って true ? false? それともなんか別の動きすんのかなあ。
KokiOya

2019/08/16 17:03

ご回答ありがとうございます。asmさんのコードでうまくいきましたので、参考程度に確認してください。またのご回答よろしくお願いします
guest

0

判定処理をメソッドにし、いくつかのケースを試してみました。

a.rb

ruby

1def check(ary) 2 filtered = ary.select{|x| x != ""} 3 filtered.length == filtered.uniq.length 4end 5 6TESTS = [ 7 [], [''], 8 ['a'], ['a', ''], 9 ['a', 'a'], ['a', 'a', ''], 10 ['a', 'b'], ['a', 'b', ''], 11 ['', ''], 12 13 [nil], [nil, ''], 14 [nil, nil], [nil, nil, ''], 15 [[1, 2], [2, 1]], 16 # nil 17] 18 19TESTS.each do |ary| 20 p("#{check(ary)}: #{ary}") 21end

実行例
イメージ説明

投稿2019/08/16 23:54

katoy

総合スコア22324

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

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

0

たくさんのご回答ありがとうございました。今回はasmさんのコードをそのまま使わせてもらいました。

ary = [a,b,c,d].grep_v("") if !ary.uniq! 何らかのアクション end

たくさんご回答いただけたのに採用できないものがあったこと大変申し訳ありませんでした。この度は本当にありがとうございました。またのご回答よろしくお願いします。

投稿2019/08/16 16:46

編集2019/08/16 17:05
KokiOya

総合スコア27

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

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

0

!ary.reject{|a| a==""}.uniq!

投稿2019/08/16 09:51

winterboum

総合スコア23347

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

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

tatsu99

2019/08/16 10:57

a = "" b = "" c = "" d = "" ary = [a,b,c,d] のとき、trueになってしまいますが、それは、意図された動作でしょうか。
winterboum

2019/08/16 11:05

意図しています。 ここは仕様がはっきりしていないんですね。 で、 「””は無視する。残ったものに重複がなければ true」 をそのまま解釈しました。
winterboum

2019/08/16 11:26 編集

false にするならこうかなぁ。 (compressed = ary.reject{|a| a== ""}).present? && !compressed.uniq! # 無理やりonelinerにするな!
KokiOya

2019/08/16 16:49

ご回答ありがとうございます。前回もご回答していただき、いつもありがとうございます。本当に助かっています。これからも回答していただけると幸いです。本当にありがとうございました。
guest

0

値が""である要素を削除して、その結果、1件以上のデータがあり、かつ重複がないなら、アクション
を起こします。

ruby

1ary = [a,b,c,d] 2ary.delete("") 3if ary.length > 0 && ary.length == ary.uniq.length 4 puts "ACTION" 5end

投稿2019/08/16 01:17

tatsu99

総合スコア5438

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

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

KokiOya

2019/08/16 17:01 編集

ご回答ありがとうございました。大変参考にさせてもらい、一度はこちらの方法でうまくいったのですが、今回はasmさんのコードを使わせてもらいました。またのご回答よろしくお願いします
guest

0

考えてみました

ruby

1# frozen_string_literal: true 2 3# NOTE: Rails 上では不要 4# スッピンの Ruby コードとして書いているので require している 5require 'active_support' 6require 'active_support/core_ext' 7 8def validate_uniqueness_check(array) 9 # uniq で重複排除した結果と配列の差異は発生しないか 10 is_all_unique = 11 array.size.eql?(array.uniq.size) 12 13 # 配列中の文字列に空白文字が含まれないか 14 is_not_included_empty_string = 15 array.exclude?('') 16 17 is_all_unique && is_not_included_empty_string 18end 19 20# ランダムな値を生成, a 〜 d までの変数に多重代入 21# (適当なアルファベット4文字を生成) 22a, b, c, d = 23 Array.new( 24 4, 25 -> { ('a'..'z').to_a.sample(4).join } 26 ).map(&:call) 27 28# いくつか テスト用データのパターンを作成 29sample_x = [a, b, c, d] # ぜんぶ違う値 30sample_y = [a, b, c, ''] # 空白文字が含まれる 31sample_z = [a, b, 'foo', 'foo'] # 同じ値が含まれる 32 33# データを渡して結果を確認 34p validate_uniqueness_check(sample_x) # => true 35p validate_uniqueness_check(sample_y) # => false 36p validate_uniqueness_check(sample_z) # => false

素朴に、考えられる条件の通り実装してもいいのですが、「こういう状況のときに、こうしたい」というコード以外の部分について、より詳しく言及されていれば、また違った回答が得られるかもしれません

なにか参考になれば幸いです

投稿2019/08/15 14:14

gouf

総合スコア2321

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

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

KokiOya

2019/08/16 16:51

ご回答ありがとうございました。とても参考になりました!本当にありがとうございました。これからもよろしくお願いします。
guest

0

条件式は以下のようになります。

ruby

1ary = [a,b,c,d] 2 3ary.select{ |e| e !=""}.uniq.count == ary.select{ |e| e !=""}.count

4つの変数を一つの配列にまとめ、""であるような要素を除外した後に「ユニークな要素数=全要素数」になっていれば、すなわち4つの変数の中身がバラバラということになります。
逆に、例えばaとbの変数の中身が一緒であればユニークな要素数は全要素数よりも1小さくなります。

投稿2019/08/15 14:04

gnbrganchan

総合スコア438

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

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

tatsu99

2019/08/16 11:03

a = "" b = "" c = "" d = "" のときも、条件が成立しますが、意図された結果でしょうか。
gnbrganchan

2019/08/16 13:12

質問内容からこれが想定されるものと判断しました。
KokiOya

2019/08/16 16:52

ご回答ありがとうございました。とても参考にさせていただきました。またのご回答よろしくお願いします。
guest

0

「a,b,c,dのうち、空文字列でないもので、値が重複するものが存在しない」ときにtrueとなる条件式です。

[a, b, c, d]. select{|x| not x.empty?}. #空文字列を除去 group_by{|x| x}. #同じ値でグルーピングする select{|k, v| v.size > 1}. #サイズ2以上のグループ(重複要素のグループ)だけ抽出する empty? #サイズ2以上のグループが存在するかどうか判定

投稿2019/08/15 13:58

編集2019/08/15 14:06
set0gut1

総合スコア2413

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

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

KokiOya

2019/08/16 16:52

ご回答ありがとうございます。またのご回答よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問