tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル点数で順位を付ける方法を教えて下さい
記事No11315
投稿日: 2014/09/03(Wed) 11:04
投稿者たちばなん
初心者すぎる質問で申し訳ありません。
自分で調べて、クイックソートを使えば出来るらしいのですが、1次配列のサンプルしか見つけられず困っています。
(クイックソートの意味が分からないので、自分で改変もできないです。)

また、クイックソートの様な難解な物を使わないで、簡単なコードで出来るのなら、そっちの方が良いので、
アドバイスお願いします。

では、

ある物件、500件分の点数が配列に既に入力されています。

Dim SC(500,2) as Single

SC(1,1)=30.1
SC(2,1)=42.3
SC(3,1)=15.6
SC(4,1)=10
SC(5,1)=90
SC(6,1)=54.3
SC(7,1)=31




SC(500,1)=88.4

SC(**,2)の方はまだ何も入力していない状態です。
SC(**,0)には件名が既に入力されています。

そこで、点数が高い順に1位、2位・・・500位と順位を付け、
その順位をSC(**,2)に格納したいのですが、方法が判りません。

教えて頂けませんでしょうか?
※同点は無いとして下さい。

VB.2008 or EXCEL.VBA で使います。
VB歴は5年くらいですが、スキルは初心者です。

[ツリー表示へ]
タイトルRe: 点数で順位を付ける方法を教えて下さい
記事No11316
投稿日: 2014/09/03(Wed) 15:37
投稿者魔界の仮面弁士
> ある物件、500件分の点数が配列に既に入力されています。
> Dim SC(500,2) as Single
これだと、0〜500 までの「501件」ではありませんか?
SC(0, x) は使用しない…ということでしょうか。


> SC(**,2)の方はまだ何も入力していない状態です。
> SC(**,0)には件名が既に入力されています。

(, 2) の「何も入力していない」は 0.0 なり、Single.NaN なりで代用できますが、
(, 0) の「件名」を As Single のデータ型で表現するのは無理があります。

データ構造を見直した方がよろしいかと。


> そこで、点数が高い順に1位、2位・・・500位と順位を付け、
> その順位をSC(**,2)に格納したいのですが、方法が判りません。

Linq を使ってみるとか。


'Linq が使えるよう、点数部分のみの 1 次元配列に変換
Dim points(500) As Single
For p = 0 To 500
    points(p) = SC(p, 1)
Next

'ランキングを取得
Dim q = points.Select(Function(Point, Index) New With {Key Index, Point}) _
        .OrderByDescending(Function(p) p.Point) _
        .Select(Function(p, Rank) New With {Key p.Index, p.Point, Rank})

'ランキングを、二次元配列変数 SC に書き戻す
For Each p In q
    'SC(p.Index, 1) = p.Point
    SC(p.Index, 2) = p.Rank + 1 'ランキングは 0 位からではなく 1 位から始まるため、+1 する
Next

[ツリー表示へ]
タイトルRe^2: 点数で順位を付ける方法を教えて下さい
記事No11317
投稿日: 2014/09/03(Wed) 18:13
投稿者たちばなん
早速のご対応ありがとうございます。

全く見た事の無い命令です。(初心者レベルの参考本しか持ってませんので。)
これでやってみます。

> これだと、0〜500 までの「501件」ではありませんか?
> SC(0, x) は使用しない…ということでしょうか。
おっしゃる通りです。1から使っています。

> (, 0) の「件名」を As Single のデータ型で表現するのは無理があります。
件名は全て番号になっております。(宝くじの番号みたいな)
偶然と言いますか、あえてそうした訳では無いです。

全くご指摘の通り、件名が文字列で有ったなら使えなかったです。

> データ構造を見直した方がよろしいかと。
別の機会で使用する時は、その様に致します。(型を指定しなければいいだけ。じゃないですよね。)

本当にありがとうございました。

[ツリー表示へ]