配列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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
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
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
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
総合スコア84505
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/25 16:13
2016/06/26 00:06
2016/06/29 13:14
0
なるほど、では以下の様にします。
- nums のお尻から1を探します(二番目の1が何処にあるのか探します)
- 見つけたらそこより前の半分が nums そこより後ろ半分を nums1 とします
で良いかと思います
投稿2016/06/25 08:23
総合スコア69
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
- numsから値をとりだす
- 取り出した値と同じものが配列の中にまだあるのか探す
- 存在している場合はインデックスをとって、そこで配列をわける
- 上気を繰り返す
で、分けられると思います。
が、配列のサイズがわからず、いくつ同じ要素がくるのかわからないので、ロジックとしてはイマイチな気がします。
配列のサイズがいつも10個くらいで、わけても3つの配列ができるぐらいならいいですけど。
自分なら
配列numsの要素で同じ要素が再度現れた時に配列を分けたい
のようなロジックは書きません。
なんで配列を分けたいのか解らないのでこれ以上はなんともいえないですが。
投稿2016/06/25 08:09
編集2016/06/25 08:09総合スコア69
0
nums1 = nums[5, 5] で nums 配列の左から 6 番目を先頭に 5 つの要素を持った配列を作成できます。
投稿2016/06/25 07:44
総合スコア28660
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/29 13:15