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

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

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

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

Q&A

解決済

5回答

524閲覧

配列内の数値を合計する方法(特殊)-Ruby

kzd847686

総合スコア53

Ruby

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

1グッド

1クリップ

投稿2018/09/20 10:12

前提・実現したいこと

配列内のプラスの数値のみ、マイナスの数値のみを合計し、それぞれ表示させたいです

発生している問題

if文を使えば簡単にできますが、より簡潔にできる方法が知りたいです。

該当のソース

array1 = [1,4,5,0,-5,8,9,-13] # プラスとマイナスが混合
array2 = [1,4,5,0,5,8,9,13] # プラスのみ
array3 = [-1,-4,-5,0,-5,-8,-9,-13] # マイナスのみ
array4 = [0,0,0] # 0のみ

試したこと

if文を使えば簡単にできますが、より簡潔にできる方法が知りたいです。
例えばarray1 ~ 5 をそれぞれ、プラスの数値のみ合計、マイナスの数値のみ合計し、それぞれの合計の数を出力させたいです。

DrqYuto👍を押しています

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

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

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

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

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

guest

回答5

0

Enumerable#partitionNumeric#positive?を使って正と負に分けたあとで、sumでそれぞれ合計しました。

Ruby

1array1 = [1, 4, 5, 0, -5, 8, 9, -13] 2array1.partition(&:positive?).map(&:sum) 3#=> [27, -18]

投稿2018/09/20 11:02

y-doi

総合スコア322

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

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

0

ベストアンサー

こんな漢字で、

ruby

1> array1 = [1,4,5,0,-5,8,9,-13] 2=> [1, 4, 5, 0, -5, 8, 9, -13] 3> array1.select{|n|n>0}.sum 4=> 27 5> array1.select{|n|n<0}.sum 6=> -18

投稿2018/09/20 10:28

hichon

総合スコア5737

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

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

dice142

2018/09/20 10:39

sumなんて便利なものがあったんですね! 知りませんでした!
guest

0

yusuke23さんの回答がベストだと思いますが、思いついたので書いておきます。

Ruby

1array1 = [1,4,5,0,-5,8,9,-13] 2sum = array1.each_with_object([0,0,0]){|x,o| o[x<=>0]+=x} 3 4p sum #=> [0, 27, -18]

投稿2018/09/20 11:31

otn

総合スコア84499

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

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

0

selectを使えば必要な値のみを抽出できるので、そこからmapなどで合計を計算するという方法があります。
select
map

投稿2018/09/20 10:31

dice142

総合スコア5158

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

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

0

ruby

1$ irb 2irb(main):001:0> array1 = [1,4,5,0,-5,8,9,-13] 3=> [1, 4, 5, 0, -5, 8, 9, -13] 4 5irb(main):002:0> array1.group_by{|x| x<=> 0} 6=> {1=>[1, 4, 5, 8, 9], 0=>[0], -1=>[-5, -13]} 7 8irb(main):003:0> array1.group_by{|x| x<=> 0}.transform_values(&:sum) 9=> {1=>27, 0=>0, -1=>-18}

追記:
負値、 0 , 正値の3つに分けているのは意味があります。負、正 の値群の 合計だけでなく、平均値や中央値も求めようと思った場合、 0 の値が入っていると計算結果が思った通りにならないからです。

投稿2018/09/22 01:43

編集2018/09/23 10:49
katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問