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

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

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

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

Q&A

解決済

6回答

980閲覧

同じ要素が来たら、それ以降を分ける配列を作成したい

terate

総合スコア103

Ruby

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

0グッド

0クリップ

投稿2016/06/25 07:33

編集2016/06/25 08:16

配列numsの要素で同じ要素が再度現れた時に配列を分けたいです。
どのようにしたら良いでしょうか?

nums = [1,2,3,4,5,1,20,30,40,50]

1がnums[5]で再び出現するので、

nums = [1,2,3,4,5]

nums1 = [1,10,20,30,40]

となるようにしたいです。

※追記
nums[5]にまた1が来るとは限らず、何番目の要素に再度1が来るかわからない前提でお願い致します。

※追記2
nums[0]は1と決まっていて、1がまた来た時に配列を分けます。1は配列numsの中にnums[0]以外に必ずもう1つしかありません。なので配列はnumsとnums1の二つのみとなります。

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

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

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

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

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

guest

回答6

0

こんな感じのコードを書きました!

Ruby

1nums = [1,2,3,4,5,1,20,30,40,50] 2nums_c = nums 3nums1 = Array.new 4 5nums.each_index do |i| 6 if nums[i+1] == 1 7 nums = nums_c.slice(0..i) 8 nums1 = nums_c.slice(i+1..-1) 9 end 10end 11p nums 12p nums1

実行結果

[1, 2, 3, 4, 5] [1, 20, 30, 40, 50]

順番に1を探して行って初めて出会ったところでnumsを二つに分解します。
これなら何番目の要素に1が来るかわからず、かつ1がもう一つだけという条件にもしっかり対応しているかと!

投稿2016/06/28 08:29

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

terate

2016/06/29 13:15

なるほど〜こういうやり方もあるのですね!ありがとうございます!
guest

0

配列中の 1 を探して、その場所で分割するという方法で書いてみました。
1 つ目の方法は 1 の出現回数が 2 であることを前提にしたコードです。
2つ目は最初の方法を一般化しています。
1 の出現回数回数にかかわらず、その箇所ごとに分割をします。

ruby

1nums = [1, 2, 3, 4, 5, 1, 20, 30, 40, 50] 2 3pos = nums[1..-1].index(nums[0]) 4p [nums[0..pos], nums[pos + 1..-1]] 5 6pos = nums.each_index.select { |i| nums[i] == nums[0] } << 0 7p (0...(pos.length - 1)).inject([]) { |a, e| a << nums[pos[e]..pos[e + 1] - 1] }

実行結果

[[1, 2, 3, 4, 5], [1, 20, 30, 40, 50]] [[1, 2, 3, 4, 5], [1, 20, 30, 40, 50]]

投稿2016/06/26 02:02

katoy

総合スコア22324

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

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

terate

2016/06/29 13:16

katoyさんいつもありがとうございます!毎度勉強させていただいております!!
guest

0

ベストアンサー

こんなのでどうでしょうか。nums[0]と同じ物がこれまでに何度出てきたかを変数nに保持してそれで分けます。

Ruby

1n=0 2nums, nums1 = nums.group_by{|x| n+=1 if x==nums[0];n}.values

投稿2016/06/25 10:09

otn

総合スコア84505

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

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

terate

2016/06/25 16:13

ありがとうございます!すごいですね、、見事に分かれました。ただ、どこでどういう処理が行われているのかが私のレベルではまだ理解できず、大変恐縮なのですが日本語で少しどこでどういうことをしているか簡単にでも教えていただくことは出来ませんでしょうか?
otn

2016/06/26 00:06

回答に書いた通り、num[0]と同じ物がこれまでに何度出てきたかをnに持ちます。 そのnの値で、配列をグルーピングするのがgooup_byメソッドで、結果が {1=>[1, 2, 3, 4, 5], 2=>[1, 20, 30, 40, 50]} というハッシュになります。欲しいのは、nの値じゃなくてグルーピング後の要素だけなので、valuesで、ハッシュの値だけを取ります。
terate

2016/06/29 13:14

ありがとうございます!大変わかりやすいです!御礼が遅れて申し訳ありませんでした!
guest

0

なるほど、では以下の様にします。

  1. nums のお尻から1を探します(二番目の1が何処にあるのか探します)
  2. 見つけたらそこより前の半分が nums そこより後ろ半分を nums1 とします

で良いかと思います

投稿2016/06/25 08:23

azurite2016

総合スコア69

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

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

0

  1. numsから値をとりだす
  2. 取り出した値と同じものが配列の中にまだあるのか探す
  3. 存在している場合はインデックスをとって、そこで配列をわける
  4. 上気を繰り返す

で、分けられると思います。
が、配列のサイズがわからず、いくつ同じ要素がくるのかわからないので、ロジックとしてはイマイチな気がします。
配列のサイズがいつも10個くらいで、わけても3つの配列ができるぐらいならいいですけど。
自分なら

配列numsの要素で同じ要素が再度現れた時に配列を分けたい

のようなロジックは書きません。

なんで配列を分けたいのか解らないのでこれ以上はなんともいえないですが。

投稿2016/06/25 08:09

編集2016/06/25 08:09
azurite2016

総合スコア69

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

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

terate

2016/06/25 08:17

ありがとうございます!なるほど! 私の前提のご説明が足りなかったので追記2も追加致しました!ただ、すごい勉強になりました!ありがとうございます!
guest

0

nums1 = nums[5, 5] で nums 配列の左から 6 番目を先頭に 5 つの要素を持った配列を作成できます。

投稿2016/06/25 07:44

Zuishin

総合スコア28660

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

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

terate

2016/06/25 07:58

ありがとうございます! すみません、説明不足でしたがnums[5]にまた1が来るとは限らず、何番目の要素に来るかわからない前提で教えていただけたら幸いです。
Zuishin

2016/06/25 08:38

要素を順に見ていって初めて 1 が出たところから、次に 1 が出るところまでです。 これはできますよね?
Zuishin

2016/06/25 08:40

最初が 1 と決まっているなら、azurite2016 さんのおっしゃる、最後から見ていく方法がいいかと思います。「番兵」という手法です。検索してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問