- PR -

配列でグループNoを付番するには

1
投稿者投稿内容
kosmas
会議室デビュー日: 2008/09/19
投稿数: 8
投稿日時: 2009-02-03 15:56
お世話になります。
2日程悩みに悩んで解決できない為、質問させて頂きます。
配列のアルゴリズムをご検討頂ければ助かります。

配列:二次元配列
Dim IntAry(5,2) As String
以下の数値が代入されているとします。
9 10
26
40 41
60 71
71 72
72 73
この時、同行数値は同グループとし、次行数値がどちらかに同数値があれば同じグループとします。
9 10
26
40 41
60 71
71 72 (71が同数なので上のグループと同じ)
72 73(72が同数なので上のグループと同じ)

結果は以下のようにしたい。
2列目にグループ名を付番する。
9 10 0
26 1
40 41 2
60 71 3
71 72 3
72 73 3

▼以下のアルゴリズムでは旨くクループ分けができませんでした。
どなたか、お助け願います。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim IntAry(5, 2) As String
'Aの値 'Bの値
IntAry(0, 0) = 9 : IntAry(0, 1) = 10
IntAry(1, 0) = 26 : IntAry(1, 1) = ""
IntAry(2, 0) = 40 : IntAry(2, 1) = 41
IntAry(3, 0) = 60 : IntAry(3, 1) = 71
IntAry(4, 0) = 71 : IntAry(4, 1) = 72
IntAry(5, 0) = 72 : IntAry(5, 1) = 73
Dim i, j, k As Integer
Dim n As Integer = 0 ' グループ数

For i = 0 To 5
For j = 0 To 5
For k = 0 To n ' グループ数分の処理
If IntAry(j, 2) = k Then 'グループk
'グループkにAかBの値があれば
If IntAry(i, 0) = IntAry(k, 0) Or IntAry(i, 1) = IntAry(k, 0) Or IntAry(i, 0) = IntAry(k, 1) Or IntAry(i, 1) = IntAry(k, 1) Then
IntAry(i, 2) = n
Else
IntAry(i, 2) = n + 1
End If
End If
Next
Next
MsgBox(IntAry(i, 0) & ":" & IntAry(i, 1) & ":" & IntAry(i, 2))
Next

End Sub

King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-02-03 16:34
動作確認はしてませんがこんな感じで出来ませんか。

コード:
Dim groupNo As Integer

groupNo = 0

For i = 0 To 5
    If 0 < i Then
        If Not (IntAry(i - 1, 0) = IntAry(i, 0) Or _
                IntAry(i - 1, 0) = IntAry(i, 1) Or _
                IntAry(i - 1, 1) = IntAry(i, 0) Or _
                IntAry(i - 1, 1) = IntAry(i, 1)) Then
            groupNo = groupNo + 1
        End If
    End If

    IntAry(i, 2) = CStr(groupNo)
Next


あと
「IntAry(0, 0) = 9 : IntAry(0, 1) = 10」
じゃなくて
「IntAry(0, 0) = "9" : IntAry(0, 1) = "10"」
じゃないでしょうか。
kosmas
会議室デビュー日: 2008/09/19
投稿数: 8
投稿日時: 2009-02-03 16:57
King様
早速のご回答ありがとうございます。
このような方法があったのですね。
大変勉強になりました。

動作確認しましたところ、希望の結果になりました。

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

以上
1

スキルアップ/キャリアアップ(JOB@IT)