[#8824] [REQ] Integer#{hex,dec,oct,bin}, String#bin — gotoken@... (GOTO Kentaro)

ごとけんです

38 messages 2000/01/05
[#8839] Re: [REQ] Integer#{hex,dec,oct,bin}, String#bin — matz@... (Yukihiro Matsumoto) 2000/01/06

まつもと ゆきひろです

[#8842] Re: [REQ] Integer#{hex,dec,oct,bin}, String#bin — gotoken@... (GOTO Kentaro) 2000/01/06

ごとけんです

[#8843] Re: [REQ] Integer#{hex,dec,oct,bin}, String#bin — matz@... (Yukihiro Matsumoto) 2000/01/06

まつもと ゆきひろです

[#8844] Re: [REQ] Integer#{hex,dec,oct,bin}, String#bin — gotoken@... (GOTO Kentaro) 2000/01/06

ごとけんです

[#8846] Re: [REQ] Integer#{hex,dec,oct,bin}, String#bin — matz@... (Yukihiro Matsumoto) 2000/01/06

まつもと ゆきひろです

[#8847] Re: [REQ] Integer#{hex,dec,oct,bin}, String#bin — gotoken@... (GOTO Kentaro) 2000/01/06

ごとけんです

[#8893] Re: [ruby-list:20142] Re: Range expansion? — Akinori MUSHA aka knu <knu@...>

 knuです。ruby-listから舞台を移しました。

13 messages 2000/01/09

[#8980] 1.4.3 patch for near-future *BSD IPv6 support — Jun-ichiro itojun Hagino <itojun@...>

近い将来の{Net,Free,Open}BSDにはKAME IPv6 stackが統合されています。

17 messages 2000/01/20
[#8981] Re: 1.4.3 patch for near-future *BSD IPv6 support — Jun-ichiro itojun Hagino <itojun@...> 2000/01/20

> それから、

[ruby-dev:8998] Re: sort

From: Koretsugu Daigoro <tmmcross@...>
Date: 2000-01-21 17:43:31 UTC
List: ruby-dev #8998
これつぐです。


よく考えたら、本当の意味で index を使いたいときって、
そんなにないかも……(後述)。


[ruby-dev:8990] Re: sort
> ごとけんです

> >hash を要素とする array のソートの話題の時だったと思うのですが、
> >ソートのキーとして index を使いたいときもあるんですよ。
> 
> それって、「要素が1個のハッシュ」を要素とする配列のソート
> ということでしたっけ??

要素数は関係ありません。
たとえば(ごとけんさん提案の sort を、えーと、仮に gsort と書くと)

  ary = [{ "foo"=>1, ... }, ...]
  ary.gsort{|e| e["foo"]}

のときに e["foo"] が一致する要素が複数あると
比較できなくて死んでしまうので、

  ary.sort_with_index{|e, i| [e["foo"], i]}

とでもすれば、
とりあえずソートできると言うか stable sort になると言うか、
そんな話です。

> ただ、sort_with_index の挙動がよく分かりません。例を挙げて下
> さいませんか??

説明不足でした。
キモのところだけ書くと、

  def sort_with_index!
    each_with_index{|e, i| self[i] = [yield(e, i), e]}
    sort!.filter{|e| e.pop}
  end

ということです。(ちなみに上のは破壊的です)
で、
  ary.sort_with_index{|e, i| -i}
    ary を逆順に並べます。(reverse がありますけど)
  ary.sort_with_index{|e, i| [e[0], i]}
    e[0] をキーにしてソートし、
    e[0] が一致するときは元の順番を保存します(つまり stable sort)。
  ary.sort_with_index{|e, i| i / 5}
    要素五つ毎にソートします。(なんの役に立つのかわかりませんが)
という感じです。

……。
個人的にはもっと変な index の使い方をしたこともあるんですが、
普通は stable sort ぐらいしか用途がないみたいです。

話は変わって、
「要素そのものは Comparable ではないが
ブロックによる評価でソートしたい」
ときの、
「ブロックによる評価が一致しちゃって生で比較しようとして死亡」
という悲しい出来事を回避するためには常に stable sort しておくのが
いいかもしれません。

と言うわけで、こうすればすべて丸くおさまるかも。

  def gsort!
    each_with_index{|e, i| self[i] = [yield(e), i, e]}
    sort!.filter{|e| e.pop}
  end

……でも文字列を辞書順に並べたいときとかは

  ary.gsort{|e| [e.downcase, e]}

より、単に、

  ary.gsort{|e| e.downcase}

と書けたほうがいいですよね?
うーむ……。

In This Thread