• ベストアンサー

配列の内容に重複をなくすには・・・

いつもお世話になっています。 今回VB6でプログラムを作成していて壁にぶち当たってしまいました。 分かる方がいましたらご教授下さい。 タイトル通りなんですが配列の内容の重複をなくした新しい配列を作成したいと考えています。 例 配列A: 1, 1, 2, 6, 5, 2, 3, 3 を 配列B: 1, 2, 6, 5, 3 と配列Aの先頭から順に配列Bに入れていきたいのです。 また、配列を動的配列で宣言していますが、配列Bの終わりが不定なので、最後に終端コード?を入れる 必要があるのか??と思っているのですが”EOF”なのでしょうか? for i=0 to EOF 配列B[i] next i とすればすべて取り出せるのでしょうか? 補足が必要でしたら言ってください。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

ユーザー定義型の配列にすれば動的配列にできますよ。 フォームの中とか標準モジュールに定義します。 「a」とか「b」とかは適当に。 Type UType a As Integer b As String End Type ~~~以下は私の前回回答を修正~~ Dim A(7) As UType Dim B() As UType と宣言して、 col.Add A(i).a & "|" & A(i).b, A(i).a & "-" & A(i).b に変えて下さい。 Set col = Nothingの上に出力処理で For i = 1 To col.Count '出力(例ではイミディエトウィンドウに書いてます) Debug.Print col.Item(i) Next

a-k-a
質問者

お礼

みなさんの回答を参考にしながらようやく完成しました。 プログラミングは奥が深いな~ また相談させて頂くかも知れませんがよろしくお願いいたします。 今回は本当にありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (3)

回答No.3

No.2さんと似たようなものかな? Private Sub Command1_Click()   Dim A(7) As Integer   Dim B() As Integer   Dim col As New Collection   Dim i As Integer   A(0) = 1   A(1) = 1   A(2) = 2   A(3) = 6   A(4) = 5   A(5) = 2   A(6) = 3   A(7) = 3 'ここから本題↓   For i = LBound(A) To UBound(A)     '値をキーにしてコレクションに追加してみる     On Error Resume Next     col.Add A(i), CStr(A(i))     If Err.Number = 0 Then       '無事に追加できれば重複してないので配列Bに追加       ReDim Preserve B(col.Count - 1)       B(col.Count - 1) = A(i)     End If     On Error GoTo 0   Next   Set col = Nothing End Sub

a-k-a
質問者

補足

早速ありがとうございます. 色々知らない関数?もあり目から鱗状態です.一つずつ確認したいと思います. あれから色々組み入れていると例では足りない?ような考え方になってしまいました. というのも 配列A: 1, 1, 2, 6, 5, 2, 3, 3 配列C: a, b, a, a, c, c, a, a のようにそれぞれ対にして一つの意味をもたさなければ?(1-aでペア,1-bとは別もの)ということになりました. 2次元配列なら...と思ったのですが,動的配列ができないようで 1次元配列を2つ作ってやってみようと思い立ちました. 最大でも30程度のデータかと思うので配列A(30,30)としてもいけるのかな?? 配列B: 1, 1, 2, 6, 5, 2, 3 配列D: a, b, a, a, c, c, a のような感じで出力がしたいのです. (表のイメージ) 1 | a 1 | b 2 | a . | . 改良して対応することは可能なのでしょうか?

すると、全ての回答が全文表示されます。
回答No.2

お世話になります。 以下のような方法はいかがでしょうか。 1. まず Dictionary で重複の無いデータを作成します。 2. Dictionary に登録された数分の要素をもつ 配列を作成します。 3. 2 で作成した配列に Dictionary の値を入れます。 Private Sub Command1_Click()      Dim arrayA(7) As Integer   arrayA(0) = 1   arrayA(1) = 1   arrayA(2) = 2   arrayA(3) = 6   arrayA(4) = 5   arrayA(5) = 2   arrayA(6) = 3   arrayA(7) = 3   ' Scripting.Dictionary を使用する   Dim dic As Object   Set dic = CreateObject("Scripting.Dictionary")   Dim checkValue As Variant   For Each checkValue In arrayA     If Not dic.Exists(CInt(checkValue)) Then       ' 存在していなければ、Dictionary に登録       dic.Add CInt(checkValue), "dummy"     End If   Next      ' 結果用の配列   Dim arrayB() As Integer   ReDim arrayB(dic.Count - 1)   Dim key As Variant   Dim index As Integer   index = 0   For Each key In dic.Keys     arrayB(index) = CInt(key)     index = index + 1   Next   Set dic = Nothing      ' 作成の配列の内容を出力   Dim value As Variant   For Each value In arrayB     Debug.Print value   Next    End Sub

a-k-a
質問者

お礼

みなさんの回答を参考にしながらようやく完成しました。 プログラミングは奥が深いな~ また相談させて頂くかも知れませんがよろしくお願いいたします。 今回は本当にありがとうございました。

a-k-a
質問者

補足

早速ありがとうございます. Scripting.Dictionaryとは初めてしりました. 勉強になります. あれから色々組み入れていると例では足りない?ような考え方になってしまいました. というのも 配列A: 1, 1, 2, 6, 5, 2, 3, 3 配列C: a, b, a, a, c, c, a, a のようにそれぞれ対にして一つの意味をもたさなければ?(1-aでペア,1-bとは別もの)ということになりました. 2次元配列なら...と思ったのですが,動的配列ができないようで 1次元配列を2つ作ってやってみようと思い立ちました. 最大でも30程度のデータかと思うので配列A(30,30)としてもいけるのかな?? 配列B: 1, 1, 2, 6, 5, 2, 3 配列D: a, b, a, a, c, c, a のような感じで出力がしたいのです. (表のイメージ) 1 | a 1 | b 2 | a . | . 改良して対応することは可能なのでしょうか?

すると、全ての回答が全文表示されます。
回答No.1

適当ですが。。。 dim i,i_max as integer 'A dim j,j_max as integer 'B dim flg as boolean i = 0 j = 0 i_max = 20 j_max = 0 for i=0 to i_max step 1 flg = 0 for j=0 to j_max step 1 if A[i] = B[j] then flg = 1 exit for end if next if flg = 0 then ' else j_max = j_max + 1 end if next

a-k-a
質問者

お礼

みなさんの回答を参考にしながらようやく完成しました。 プログラミングは奥が深いな~ また相談させて頂くかも知れませんがよろしくお願いいたします。 今回は本当にありがとうございました。

a-k-a
質問者

補足

早速ありがとうございます. あれから色々組み入れていると例では足りない?ような考え方になってしまいました. というのも 配列A: 1, 1, 2, 6, 5, 2, 3, 3 配列C: a, b, a, a, c, c, a, a のようにそれぞれ対にして一つの意味をもたさなければ?(1-aでペア,1-bとは別もの)ということになりました. 2次元配列なら...と思ったのですが,動的配列ができないようで 1次元配列を2つ作ってやってみようと思い立ちました. 最大でも30程度のデータかと思うので配列A(30,30)としてもいけるのかな?? 配列B: 1, 1, 2, 6, 5, 2, 3 配列D: a, b, a, a, c, c, a のような感じで出力がしたいのです. (表のイメージ) 1 | a 1 | b 2 | a . | . 追加して対応することは可能でしょうか?

すると、全ての回答が全文表示されます。

関連するQ&A