DOBON.NET DOBON.NETプログラミング掲示板過去ログ

配列のソートについて

環境/言語:[WindowsXP:VB.NET2003]
分類:[ASP.NET]

2007/06/28(Thu) 15:27:56 編集(投稿者)

はじめまして、現在データ表示として

Dim name(10) As String
Dim height(10),weight(10) As Integer

name(0)="A",height(0)=160,weight(0)=60
name(1)="B",height(1)=175,weight(1)=80
name(2)="C",height(2)=170,weight(2)=50
name(3)="D",height(3)=150,weight(3)=70
と配列格納されたデータを、
D,150,3
A,160,2
C,170,1
B,175,4
と表示したいと考えております。
height順に表示はできるのですが、
weightの表示の様に格納されたデータでのランク付けは
可能なのでしょうか?
可能な場合は、どの様な関数を使用すれば良いのかを
お教えいただきたく思います。
  • 題名: Re[1]: 配列のソートについて
  • 著者: 千八之介
  • 日時: 2007/06/28 17:34:35
  • ID: 19957
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
IComparerインターフェイスを使って次のようにしてみました。
内部クラスCompareByHeightとCompareByWeightのCompareメソッドでは、
簡単のため引数にNothingがあった場合の処理を省略しています。

Class Person
    Public Name As String
    Public Height As Integer
    Public Weight As Integer
    Public WeightOrder As Integer
    Public Sub New(ByVal name As String, ByVal height As Integer, ByVal weight As Integer)
        Me.Name = name
        Me.Height = height
        Me.Weight = weight
    End Sub

    Class CompareByHeight
        Implements IComparer
        Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer _
                Implements System.Collections.IComparer.Compare
            Dim person1 As Person = DirectCast(x, Person)
            Dim person2 As Person = DirectCast(y, Person)
            If person1.Height < person2.Height Then
                Return -1
            ElseIf person1.Height > person2.Height Then
                Return 1
            Else
                Return 0
            End If
        End Function
    End Class

    Class CompareByWeight
     '.Heightを.Weightに替える他はCompareByHeightと同じ
    End Class
End Class

これを使って以下のようにすると、所要の結果が得られます(同体重の人がいた場合は考慮していません)。

Const PERSON_COUNT As Integer = 4
Dim p(PERSON_COUNT - 1) As Person
p(0) = New Person("A", 160, 60)
p(1) = New Person("B", 175, 80)
p(2) = New Person("C", 170, 50)
p(3) = New Person("D", 150, 70)
Array.Sort(p, New Person.CompareByWeight)
For i As Integer = 0 To PERSON_COUNT - 1
    p(i).WeightOrder = i + 1
Next
Array.Sort(p, New Person.CompareByHeight)

DOBON.NET | プログラミング道 | プログラミング掲示板