55

Rubyを使用して数値の配列の中央値を計算するにはどうすればよいですか?

私は初心者で、配列の長さが奇数と偶数の場合の処理​​に苦労しています。

4

11 に答える 11

107

これは、偶数と奇数の両方の長さの配列で機能し、配列を変更しないソリューションです。

def median(array)
  return nil if array.empty?
  sorted = array.sort
  len = sorted.length
  (sorted[(len - 1) / 2] + sorted[len / 2]) / 2.0
end
于 2013-02-13T17:37:06.713 に答える
4

中央値を計算することによってあなたがこれを意味するならば

それで

a = [12,3,4,5,123,4,5,6,66]
a.sort!
elements = a.count
center =  elements/2
elements.even? ? (a[center] + a[center+1])/2 : a[center]  
于 2013-02-13T17:30:58.017 に答える
4

nbarrailleに似ていますが、これが機能する理由を追跡する方が少し簡単です。

class Array
  def median
    sorted = self.sort
    half_len = (sorted.length / 2.0).ceil
    (sorted[half_len-1] + sorted[-half_len]) / 2.0
  end
end

half_len =(アイテム数が奇数の配列の場合)配列の中央までの要素の数。

さらに簡単:

class Array
  def median
    sorted = self.sort
    mid = (sorted.length - 1) / 2.0
    (sorted[mid.floor] + sorted[mid.ceil]) / 2.0
  end
end
于 2013-12-19T09:26:32.820 に答える
4
  def median(array)                          #Define your method accepting an array as an argument. 
      array = array.sort                     #sort the array from least to greatest
      if array.length.odd?                   #is the length of the array odd?
        array[(array.length - 1) / 2] #find value at this index
      else array.length.even?                #is the length of the array even?
       (array[array.length/2] + array[array.length/2 - 1])/2.to_f
                                             #average the values found at these two indexes and convert to float
      end
    end
于 2015-04-03T00:57:31.353 に答える
1

エッジケースを処理するより正しいソリューション:

class Array
  def median
    sorted = self.sort
    size = sorted.size
    center = size / 2

    if size == 0
      nil
    elsif size.even?
      (sorted[center - 1] + sorted[center]) / 2.0
    else
      sorted[center]
    end
  end
end

証明する仕様があります:

describe Array do
  describe '#median' do
    subject { arr.median }

    context 'on empty array' do
      let(:arr) { [] }

      it { is_expected.to eq nil }
    end

    context 'on 1-element array' do
      let(:arr) { [5] }

      it { is_expected.to eq 5 }
    end

    context 'on 2-elements array' do
      let(:arr) { [1, 2] }

      it { is_expected.to eq 1.5 }
    end

    context 'on odd-size array' do
      let(:arr) { [100, 5, 2, 12, 1] }

      it { is_expected.to eq 5 }
    end

    context 'on even-size array' do
      let(:arr) { [7, 100, 5, 2, 12, 1] }

      it { is_expected.to eq 6 }
    end
  end
end
于 2018-04-02T12:54:58.147 に答える
1

私はリファインメントを使用するのが好きです。これは、システムに付随的な影響を与えることなく、ルビークラスにモンキーパッチを適用するための安全な方法です。

使用は、新しい方法よりもはるかにクリーンになります。

Refinementsを使用すると、クラスにモンキーパッチをArray適用して実装できます。Array#medianこのメソッドは、リファインメントを使用しているクラスのスコープ内でのみ使用できます。:)

改良

module ArrayRefinements
  refine Array do
    def median
      return nil if empty?
      sorted = sort
      (sorted[(length - 1) / 2] + sorted[length / 2]) / 2.0
    end
  end
end

class MyClass
  using ArrayRefinements
  # You can use the Array#median as you wish here

  def test(array)
    array.median
  end
end

MyClass.new.test([1, 2, 2, 2, 3])
=> 2.0
于 2021-01-17T22:50:51.473 に答える
0
def median(array)
  half = array.sort!.length / 2
  array.length.odd? ? array[half] : (array[half] + array[half - 1]) / 2 
end

*長さが偶数の場合、0から始まるインデックスを考慮して、中間点と中間点-1を追加する必要があります。

于 2015-02-22T23:52:03.747 に答える
0
def median(arr)
    sorted = arr.sort 
    if sorted == []
       return nil
    end  

    if sorted.length % 2 != 0
       result = sorted.length / 2 # 7/2 = 3.5 (rounded to 3)
       return sorted[result] # 6 
    end

    if sorted.length % 2 == 0
       result = (sorted.length / 2) - 1
       return (sorted[result] + sorted[result+1]) / 2.0 #  (4 + 5) / 2
    end
end

p median([5, 0, 2, 6, 11, 10, 9])
于 2019-12-01T05:42:39.090 に答える
0

解決策は次のとおりです。

app_arry = [2, 3, 4, 2, 5, 6, 16].sort

# check array isn't empty
if app_arry.empty?  || app_arry == ""
  puts "Sorry, This will not work."
  return nil
end

length = app_arry.length
puts "Array length = #{length}"
puts "Array = #{app_arry}"

if length % 2  == 0
 # even number of elements
 puts "median is #{(app_arry[length/2].to_f +  app_arry[(length-1)/2].to_f)/2}"
else
 # odd number of elements
 puts "median is #{app_arry[(length-1)/2]}"
end

出力

配列の長さ=7

配列=[2、3、4、2、5、6、16]

中央値は2です

于 2020-02-04T15:26:54.603 に答える
0
def median(array, already_sorted=false)
    return nil if array.empty?
    array = array.sort unless already_sorted
    m_pos = array.size / 2
    return array.size % 2 == 1 ? array[m_pos] : mean(array[m_pos-1..m_pos])
end
于 2020-02-04T16:47:20.957 に答える
-2

私はそれが良いと思います:

#!/usr/bin/env ruby

#in-the-middle value when odd or
#first of second half when even.
def median(ary)
  middle = ary.size/2
  sorted = ary.sort_by{ |a| a }
  sorted[middle]
end

また

#in-the-middle value when odd or
#average of 2 middle when even.
def median(ary)
  middle = ary.size/2
  sorted = ary.sort_by{ |a| a }
  ary.size.odd? ? sorted[middle] : (sorted[middle]+sorted[middle-1])/2.0
end

より高速なため、sortではなくsort_byを使用しました。Rubyでは配列を降順で並べ替えます。

于 2013-09-23T09:23:07.407 に答える