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

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

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

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

Ruby on Rails

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

4回答

820閲覧

配列を合体する方法を探しています。

tenten11055

総合スコア67

Ruby

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

Ruby on Rails

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

1グッド

1クリップ

投稿2019/09/13 17:35

###やりたいこと
下記の配列Aと配列Bを合体させて、配列Aを配列Cのようにしたい。
AとBの要素の数は同じ。nilは残す。

A = [1, nil, nil, nil] B = [nil, 2. nil, nil] C = [1, 2, nil, nil]

###試したこと
1発でこれを可能にするメソッド等は見つからず、以下のことを試しました。

ruby

1[9] pry(main)> n = 0 2[10] pry(main)> B.each do |v| 3[10] pry(main)* A[n] = v if A[n].nil? 4[10] pry(main)* n += 1 5[10] pry(main)* end 6=> [nil, 2, nil, nil] 7[11] pry(main)> A 8=> [1, 2, nil, nil]

これよりも簡潔で良い方法があれば、教えてください。
宜しくお願い致します。

DrqYuto👍を押しています

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

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

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

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

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

guest

回答4

0

長さが同じ前提で、

Ruby

1A.zip(B).map{|x,y| x || y} 2とか 3A.zip(B).map(&:compact).map(&:first)

Afalseが混じっている場合には動作が違います。

投稿2019/09/14 00:29

otn

総合スコア84555

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

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

0

ベストアンサー

合体の仕様がはっきりしませんね
A = [1, nil, 1, 2 ]
B = [2, 2. 2, 1]
の時はどうなる?

A = [1, nil, 1, 2 ]
B = [2, 3. 4, 5]
の時はどうなる?

1)A,B,Cの要素の数は同じなのか
2)nil以外の要素はunique(同じ要素はAB各々一つかなし)なのか
3)nil以外の要素の種類はAB合わせて4を越えることはないのか、 
越えていたら もし 1)がYESの場合破綻するが

A,Bで起こりうる全てのパターンをイメージし
その起こりうる組み合わせの全てでCがどうなって欲しいかを考え
仕様にまとめてください

追記
もし、
○ AがnilだったらBを。AがnilでなかったらBの値に関わらすAを、
でしたら

A.map.with_index{|v,i| v || B[i]}

あ、
numnlamさんのと被ってます。 or か || かの違いだけ

投稿2019/09/13 20:44

編集2019/09/13 23:30
winterboum

総合スコア23347

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

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

tenten11055

2019/09/14 17:21 編集

ご回答ありがとうございました。 仕様の定義についても曖昧で申し訳ありませんでした。 念のため記述しておきます。 1)A,B,Cの要素の数は同じなのか →はい 2)nil以外の要素はunique(同じ要素はAB各々一つかなし)なのか →uniqueはありません。 3)nil以外の要素の種類はAB合わせて4を越えることはないのか →要素の種類とは数のことでしょうか・・・?であれば5でもなんでもOKです。 A = [1, nil, 1, 2 ] B = [2, 2. 2, 1] の場合 →[1, 2, 1, 2] A = [1, nil, 1, 2 ] B = [2, 3. 4, 5] の場合 →[1, 3, 1, 2] Aがnilの箇所にだけ、その要素と同じ位置のBの要素を代入する・・というものでした。 追記の内容で合っています。 ご回答に加え、こちらの質問の至らぬところへのご指摘までありがとうございました!!
guest

0

ruby

1A = [1, nil, nil, nil, 3] 2B = [nil, 2, nil, nil, 4] 3 4p A.zip(B) 5 6c = A.zip(B).map{|a,b| a || b} 7p c

実行例
イメージ説明

投稿2019/09/14 01:57

katoy

総合スコア22324

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

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

0

あんまりきれいじゃないですけど or 演算子を使うとかでしょうか?

ruby

1A = [1, nil, nil, nil] 2B = [nil, 2, nil, nil] 3 4C = B.map.with_index do |v, n| 5 v or A[n] 6end 7 8p C

実行結果

[1, 2, nil, nil]

この場合はBを基準に考えており、Bが優先されます。

投稿2019/09/13 20:45

編集2019/09/13 20:48
namnium1125

総合スコア2043

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

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

winterboum

2019/09/13 23:32

ごめんなさい、 or 普段使ってないので 違う考えと勘違いして被ったの出してしまいました。
namnium1125

2019/09/14 00:38

いえいえ、むしろ自分の考えが割と一般的なものだとわかり良かったです()
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問