[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2006/12/15(Fri) 11:41
投稿者名:パソポ
Eメール:
URL :
タイトル:
配列について質問です。
共通のキーを持つ配列同士を振り分けたいのですがいまいちいい方法が思いつきません。
お知恵をお借りできませんでしょうか?

例)
1.2.3.4.5
2.3.4.5.6
3,4,5,6,7
1,3,4,5,6
1,4,5,6,7
4,5,6,7,8
2,4,5,6,7
  
 ↓
1,9,12,15,18
2,7,9,11,13
3,4,5,6,7
4,5,6,7,8

第1番目のデーターで2つ以上同じキーがあればグループ同士にひとまとめにして
それそれの配列同士を加算してひとつのデーターを配列にまとめたいのですが
データーは、ランダムになってるのでそれぞれのキーは、最高で10個できる場合があります。
お願いいたします。

投稿時間:2006/12/15(Fri) 12:22
投稿者名:るしぇ
Eメール:
URL :
タイトル:
Re: 配列について質問です。
コレクションなり別の配列なりに、既に見つかったキーとその行数を
覚えておけば良いだけでは?

投稿時間:2006/12/15(Fri) 12:54
投稿者名:パソポ
Eメール:
URL :
タイトル:
Re^2: 配列について質問です。
るしぇ さん アドバイスありがとうございます。
初心者な者でなんとなく意味は解るのですが
具体的にはどんな感じでしょうか
よろしくお願いします。

> コレクションなり別の配列なりに、既に見つかったキーとその行数を
> 覚えておけば良いだけでは?

投稿時間:2006/12/15(Fri) 13:01
投稿者名:るしぇ
Eメール:
URL :
タイトル:
Re^3: 配列について質問です。
…具体的に書いてありますが?
逆に分からないのは具体的にどこですか?

別の配列を用意すること?
配列に値を入れること?
配列の要素を順番に見る方法?

投稿時間:2006/12/15(Fri) 21:02
投稿者名:パソポ
Eメール:
URL :
タイトル:
Re^4: 配列について質問です。
お手数をおかけします。
作業の内容は、配列の中からキーの要素を取り出して
同じキーがあるかふるいに掛け別の配列に取り込む
取り込んだ配列の中で必要に応じて要素を加算させ
元の配列に戻す?
こんな流れでよいのでしょうか?
実際にソースを書くとなると
よく分かりません

Dat = Split(Lists, ",")
Dat(1)でキーは取り出せるのですが・・・。


> …具体的に書いてありますが?
> 逆に分からないのは具体的にどこですか?
>
> 別の配列を用意すること?
> 配列に値を入れること?
> 配列の要素を順番に見る方法?

投稿時間:2006/12/15(Fri) 22:30
投稿者名:ヤマ@文系
Eメール:
URL :
タイトル:
Re^5: 配列について質問です。
なんだか返事のところぐちゃぐちゃになってすいません。m(_ _)m
テキストエディタで打っていたらミスが多くて
修正しようとおもったら返事になったりしてしまいました。

Redimで要素をデータ毎に再確保
splitを使う場合は、文字列なのでキャスト
(cintなどで数値へ)してやる必要があると思いました。
以下は2次元配列で処理した場合の例です。

Dim a() As Integer
Dim i As Integer
Dim intChk As Integer 'チェック用の一時保管
Dim kekka() As Integer
Dim num As Integer '結果用キーのナンバー

'データの要素の数を求める

'求めて、動的に宣言しなおす
ReDim a(6, 4) '例えばキー6 数5
ReDim kekka(6, 4) '結果 数5







'データに代入処理はここらへんでする。
'テスト用
a(0, 0) = 1
a(0, 1) = 2
a(0, 2) = 3

a(1, 0) = 1
a(1, 1) = 2
a(1, 2) = 3


Dim j As Integer

num = 1 '結果にも番号が必要なので最初は1



For intChk = 1 To 10 'チェックしたいキーデータの最大値
    For i = 0 To 2 - 1 'キーの数
        If a(i, 0) = intChk Then '要素をそれぞれ足す
           kekka(num, 0) = intChk 'キー
        For k = 1 To 4
            kekka(num, k) = kekka(num, k) + a(i, k)
         Next k
        End If
    Next i
    If kekka(num, 0) > 0 Then num = num + 1 '要素を足した場合番号インクリメント
Next intChk

(花ちゃんさますいません)

投稿時間:2006/12/16(Sat) 11:44
投稿者名:るしぇ
Eメール:
URL :
タイトル:
Re^5: 配列について質問です。
> Dat = Split(Lists, ",")
> Dat(1)でキーは取り出せるのですが・・・。
それ、質問とは全く関係無いやん?質問は『配列で。。。』
ってなってるから配列に数値データが入ってるのは前提条件です。

配列の第1番目のデータがキーなんだから
> Dat(1)でキーは取り出せるのですが・・・。
…馬鹿にされているようにしか感じませんが?
ってゆーか、配列の1番目の要素のインデックスは基本的には 0 ですが?
しかも2次元配列なんだから Dat(i,0) みたいな話から始まらないと。。。

初心者とか、そーゆー言い訳が通るレベルにさえ到達してなくって、
プログラムに関して『勉強』というものを、1時間もしてないんじゃないの?
って疑いたくなる書込みですが。。。
# プログラムは数学と同じで、勉強しないとできるようにはなりません。
# 掲示板で質問するだけでは、できるようになる事はありません。

同じ大きさの配列を用意して、
1,2,3,4,5  0,0,0,0,0
2,3,4,5,6  0,0,0,0,0
3,4,5,6,7  0,0,0,0,0
1,3,4,5,6  0,0,0,0,0

1番目の要素が0か同じキーなら足していくのが
誰でもできるんじゃない?
1,2,3,4,5  1,2,3,4,5
2,3,4,5,6  0,0,0,0,0
3,4,5,6,7  0,0,0,0,0
1,3,4,5,6  0,0,0,0,0

1,2,3,4,5  1,2,3,4,5
2,3,4,5,6  2,3,4,5,6
3,4,5,6,7  3,4,5,6,7
1,3,4,5,6  0,0,0,0,0

1,2,3,4,5  1,5,7,9,11
2,3,4,5,6  2,3,4,5,6
3,4,5,6,7  3,4,5,6,7
1,3,4,5,6  0,0,0,0,0

コードにするとこんな感じ。
[VB6.0]
Option Explicit

Private Sub Command2_Click()
    Dim intTestData() As Integer
    Dim intResultData() As Integer
    Dim i As Integer
    Dim j As Integer
    Dim k As Integer
    
    intTestData = GetTestData("1,2,3,4,5\\2,3,4,5,6\\3,4,5,6,7\\1,3,4,5,6\\1,4,5,6,7\\4,5,6,7,8\\2,4,5,6,7")
    ReDim intResultData(UBound(intTestData, 1), UBound(intTestData, 2))
    For i = 0 To UBound(intTestData, 1)
        For j = 0 To UBound(intResultData, 1)
            If intResultData(j, 0) = 0 _
            Or intResultData(j, 0) = intTestData(i, 0) Then
                intResultData(j, 0) = intTestData(i, 0)
                For k = 1 To UBound(intTestData, 2)
                    intResultData(j, k) = intResultData(j, k) + intTestData(i, k)
                Next
                Exit For
            End If
        Next
    Next
    
End Sub

Private Function GetTestData(ByVal DataText As String) As Integer()
    Dim intReturnData() As Integer
    Dim strSplitAllData() As String
    Dim strSplitLineData() As String
    Dim i As Integer
    Dim j As Integer
    
    strSplitAllData = Split(DataText, "\\")
    For i = 0 To UBound(strSplitAllData, 1)
        strSplitLineData = Split(strSplitAllData(i), ",")
        If i = 0 Then
            ReDim intReturnData(UBound(strSplitAllData, 1), UBound(strSplitLineData, 1))
        End If
        For j = 0 To UBound(intReturnData, 2)
            intReturnData(i, j) = CInt(strSplitLineData(j))
        Next
    Next
    GetTestData = intReturnData
End Function

投稿時間:2006/12/16(Sat) 20:26
投稿者名:パソポ
Eメール:
URL :
タイトル:
Re^6: 配列について質問です。
ヤマ@文系 さん、るしぇ さん アドバイスありがとうございます。

> 配列の第1番目のデータがキーなんだから
> > Dat(1)でキーは取り出せるのですが・・・。
当方の書き間違えでしたDat(1)は2番目の要素ですよね

> 初心者とか、そーゆー言い訳が通るレベルにさえ到達してなくって、
> プログラムに関して『勉強』というものを、1時間もしてないんじゃないの?
> って疑いたくなる書込みですが。。。
> # プログラムは数学と同じで、勉強しないとできるようにはなりません。
> # 掲示板で質問するだけでは、できるようになる事はありません。

独学で必要に応じてテキストやネットで必要な部分のみ勉強しているので
1から順に勉強はしておりません もっと基礎を学ばないといけないのは分かって
いるのですがなかなかうまく行きません
この機にもっと基礎を学んで皆様にアドバイスしていただいた事が理解できるように
頑張りますので今後もよろしくお願いします。
ありがとうございました。