mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Ruby - Array クラス拡張で配列要素にランク付け(同順位考慮)!

[ プログラミング ] [ Ruby ]

こんばんは。

Ruby で配列内の数値をランク付け(同順位を考慮)する方法を、 Array クラスを拡張して実装してみました。

0. 前提条件

  • Ruby 2.2.2-p95 での作業を想定。
  • 配列内の数値が大きい順に順位を付ける。
  • 同順位を考慮する。(例:要素が 3, 1, 3, 2 で、大きい順に順位付ける場合の順位を 1, 4, 1, 3 とする)

1. Ruby スクリプトの作成

実質、配列の順位付を行なっているのは1行のみで、数値が自分より大きい要素の個数 +1 を順位とするアルゴリズム。

array_rank.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#! /usr/local/bin/ruby
# coding: utf-8
#**********************************************************
# Ruby script to rank array items, considering same ranks.
#**********************************************************
#
class Array
  def rank
    # 以下の場合は例外スロー
    # - 自身配列が空
    # - 自身配列に数値以外の値を含む
    raise "Self array is nil!" if self.size == 0
    self.each do |v|
      raise "Items except numerical values exist!" unless v.to_s =~ /[\d\.]+/
    end

    # ランク付け
    self.map { |v| self.count { |a| a > v } + 1 }
  end
end

a = [9, 3, 2, 7, 1, 6, 8, 5, 10, 4]
b = [6, 8, 5, 8, 4, 9, 3, 3, 7, 1]
c = [6, 8.5, 5, 3.2, 7, 1, 8.1, 3.2, 9, 3]
d = [9, 3, 2, 7, "abc", 6, 8, 5, 10, 4]
puts "a = #{a}"
puts "--> #{a.rank}"
puts
puts "b = #{b}"
puts "--> #{b.rank}"
puts
puts "c = #{c}"
puts "--> #{c.rank}"
puts
puts "d = #{d}"
puts "--> #{d.rank}"

2. Ruby スクリプトの実行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ ./array_rank.rb
a = [9, 3, 2, 7, 1, 6, 8, 5, 10, 4]
--> [2, 8, 9, 4, 10, 5, 3, 6, 1, 7]

b = [6, 8, 5, 8, 4, 9, 3, 3, 7, 1]
--> [5, 2, 6, 2, 7, 1, 8, 8, 4, 10]

c = [6, 8.5, 5, 3.2, 7, 1, 8.1, 3.2, 9, 3]
--> [5, 2, 6, 7, 4, 10, 3, 7, 1, 9]

d = [9, 3, 2, 7, "abc", 6, 8, 5, 10, 4]
./array_rank.rb:14:in `block in rank': Exist items except numerical values! (RuntimeError)
        from ./array_rank.rb:13:in `each'
        from ./array_rank.rb:13:in `rank'
        from ./array_rank.rb:33:in `<main>'

当方の場合、意外と利用頻度が高いので、単純な処理とは言えど結構重宝しています。

以上。

Comments