• 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

IPアドレスのソートがちょっと面倒。

普通にRubyを使ってIPアドレスをソートしようとすると、

   1  ip_addrs = ["192.100.100.1", "192.11.11.1", "192.11.100.1"]
   2  ip_addrs.sort
   3  #=> ["192.100.100.1", "192.11.100.1", "192.11.11.1"]
となって、きちんとソートされない。 まぁ、当たり前と言えば当たり前なんですが・・・。

きちんとソートするためには、こんな感じにしてみる。

   1  ip_addrs.sort_by{|a| a.split(".").map{|i| "%3d" % i.to_i}}
   2  #=> ["192.11.11.1", "192.11.100.1", "192.100.100.1"]

もうちょっと綺麗に書けんなぁ? "%3d"とか、なんか嫌やなぁ。

ちなみにシェルだと、

   1  $ echo '
   2  192.100.100.1
   3  192.11.11.1
   4  192.11.100.1
   5  ' | sort -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4 -n 
   6  
   7  
   8  192.11.11.1
   9  192.11.100.1
  10  192.100.100.1

とかできるけど、-kオプションが気に入らない感じ。

もっと綺麗に書ける方法はないのだろうか・・・。

posted by Png y_tsuda on Mon 15 Sep 2008 at 17:45 with 3 comments

Comments:

Png 瀧内元気 over 15 years ago.

こんなのはどうでしょう?

   1  > ["192.100.100.1", "192.11.11.1", "192.11.100.1"].sort_by{|i| Socket.sockaddr_in nil, i}
   2  => ["192.11.11.1", "192.11.100.1", "192.100.100.1"]

Png Yu Tsuda over 15 years ago.

うわ!めっちゃシンプル!! 参考にさせていただきます!!

Png Yu Tsuda over 15 years ago.

変なことしなくても、普通にこれで良かった・・・。

   1  ip_addrs.sort_by{|a| a.split(".").map{|i| i.to_i}}
   2  #=> ["192.11.11.1", "192.11.100.1", "192.100.100.1"]
あのとき何を考えていたのだろう・・・

or Preview
Social Bookmarks
  • Delicious
  • B_entry890
  • Clip_16_12_w
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ