Ruby on Railsを使ってWebサイトを製作中なのですが、以下のような条件の書き方がわかりません。
a = ランダムな文字列 b = ランダムな文字列(ただし""もあり) c = ランダムな文字列(ただし""もあり) d = ランダムな文字列(ただし""もあり) if a,b,c,d全てが違う値の時(ただし、値が""な変数は除く) 何かしらのアクション end
変数a,b,c,dを作ってそれぞれにランダムな値が入るのですが、その際に「もしa,b,c,d全ての値が違うならば{何かしらのアクション}を起こす。ただし変数の値が""のものは除く」のような条件式が書きたいです。
ご回答よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/16 00:59
2019/08/16 12:03
2019/08/16 16:32
回答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総合スコア15147
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/15 14:02
2019/08/16 09:48
2019/08/16 10:33
2019/08/16 11:36
2019/08/16 17:02
0
Ruby は詳しくないですが…
a~d を配列にして、空文字列を除外して、ソートして
同じのが連続してなきゃokみたいな関数つくるのかなあ。
投稿2019/08/15 13:51
総合スコア7458
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/15 15:31
2019/08/16 17:03
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
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
たくさんのご回答ありがとうございました。今回はasmさんのコードをそのまま使わせてもらいました。
ary = [a,b,c,d].grep_v("") if !ary.uniq! 何らかのアクション end
たくさんご回答いただけたのに採用できないものがあったこと大変申し訳ありませんでした。この度は本当にありがとうございました。またのご回答よろしくお願いします。
投稿2019/08/16 16:46
編集2019/08/16 17:05総合スコア27
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
!ary.reject{|a| a==""}.uniq!
投稿2019/08/16 09:51
総合スコア23347
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/16 10:57
2019/08/16 11:05
2019/08/16 11:26 編集
2019/08/16 16:49
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
総合スコア5438
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
総合スコア2321
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
総合スコア438
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/16 11:03
2019/08/16 13:12
2019/08/16 16:52
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総合スコア2413
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。