プロが教えるわが家の防犯対策術!

ジャグ配列とはどういうときに使用するのか
わかる方いましたら、サンプルでいいので
教えてください。

A 回答 (11件中1~10件)

試験がてらに作ってみました、


Dictionaryの2段重ね+.NET Frameworkの ArrayList

Sub megu2()
Dim Dic As Object
Dim r As Range, rr As Range
Dim key1, key2, i As Integer

Set Dic = CreateObject("Scripting.Dictionary")

For Each r In Range("A1", Cells(Rows.Count, "A").End(xlUp))

If Not Dic.Exists(r.Value) Then Dic.Add r.Value, CreateObject("Scripting.Dictionary")
If Not Dic(r.Value).Exists(r.Offset(, 1).Value) Then Dic(r.Value).Add r.Offset(, 1).Value, CreateObject("System.Collections.ArrayList")

Dic(r.Value)(r.Offset(, 1).Value).Add (r.Offset(, 2).Value)
Next

Set rr = Range("E1")

For Each key1 In Dic.keys
rr.Value = key1
For Each key2 In Dic(key1).keys
Set rr = rr.Offset(1)
rr.Offset(, 1).Value = key2
Set rr = rr.Offset(1)
For i = 0 To Dic(key1)(key2).Count - 1
rr.Offset(i, 2).Value = Dic(key1)(key2)(i)
Next
Set rr = rr.Offset(Dic(key1)(key2).Count - 1)
Next
Set rr = rr.Offset(1)
Next

Set Dic = Nothing
End Sub

でも実際は他の方法でも出来るでしょうし、ジャグ配列はどのような時に使うかより問題解決時の1つの手段だと思いますよ。
「ジャグ配列とは」の回答画像11
    • good
    • 0
この回答へのお礼

こんなことまでできるんですね
うなります
ウォー

お礼日時:2018/08/01 10:54

質問はサンプルでしたっけ。


取り敢ず私は通常の使い方はしていなく(文字列型とか数値型とか)なので今回はDictionaryオブジェクトと.NET Frameworkの ArrayList と組み合わせたモドキな物を
書きました。

データと結果は画像にて。
分類と名称がバラバラに並んでいたとして、分類毎に横並びに換える物です。

Sub megu()
Dim Dic As Object
Dim r1 As Range, r2 As Range
Dim i As Integer, key

Set Dic = CreateObject("Scripting.Dictionary")

For Each r1 In Range("A1", Cells(Rows.Count, 1).End(xlUp))

If Not Dic.exists(r1.Value) Then Dic.Add r1.Value, CreateObject("System.Collections.ArrayList")

Dic(r1.Value).Add (r1.Offset(, 1).Value)

Next

Set r2 = Range("D1")

For Each key In Dic.Keys
r2.Value = key
Set r2 = r2.Offset(1)
For i = 0 To Dic(key).Count - 1
r2.Offset(, i + 1).Value = Dic(key)(i) ' ジャグ配列モドキ
Next
Set r2 = r2.Offset(2)
Next

Set Dic = Nothing
End Sub
「ジャグ配列とは」の回答画像10
    • good
    • 0
この回答へのお礼

なんでもできるんですね
有難うございます。

お礼日時:2018/07/31 10:09

No.4のお礼について。



>C#はエクセルで使用できるのでしょうか。

ん~、まだ経験はしていませんが。
やりたい作業をdllと言う拡張子のファイルに纏めて作成しておき、
そこに対して値を与え結果を得る事は可能なのかも知れません。
ただVBA自体が古いVBに近いのでもしかすると今の.NET以前の
VBかVC++などの方になるかもです。

C#(VC#)は.NETになって以降出てきた物のはずですので。
それにこれまで記載したのはVisualStudioと言う開発環境の中の言語というより、
基盤となる.NET Frameworkが持つ機能の一部を使っているだけです。
でもMicrosoftも最新の機能をVBAで使えるようにとはしていなく、あくまで初期の頃のほんの一部にしか過ぎません。
(私は古いMicrosoftOfficeしかないので検証した訳ではないのですが、多分そうだと思います。それに今後はPythonになるとかなんとか話も聞こえてきますし。)
    • good
    • 0
この回答へのお礼

Python確認致しました。ネットでみました。
今からパイソンを利用したほうが
よいのかな

お礼日時:2018/07/31 10:07

No.4です。



No.7さんへ

なるほど『カンマ区切り且つ改行で分けていけば』ジャグ配列になるのですね。
普段から『ReDim~』を使っていなかった為に気づけなかったと反省しました。
    • good
    • 0
この回答へのお礼

ここまで、みなさん興味あるのですね
有難うございます。

お礼日時:2018/07/30 07:22

No.3 で私が書いたのは、あくまでも、VBAの話です。


>>myPoint = myArr(2, 3)
>って多次元配列とは違うのでしょうか?

表を取り出した時に、ジャグになるという認識でしたが、読み込みのスタイルで書き直してみました。添付画像のようなスタイルになります。これなら、文句はでないと思います。

コードは見えるとは思いますが、配列を作ってその配列を入れていくことになります。
「ジャグ配列とは」の回答画像7
    • good
    • 0
この回答へのお礼

よく、わかりました。
有難うございます。

お礼日時:2018/07/30 07:17

No.4です。



No,5さんへ

>ListやArrayListがVBAで使用できるということを初めて知りました。
私も書いててVBAとVBでごっちゃになりましたが、VBAで使えたのは
System.Collections.ArrayList
System.Collections.SortedList
などですね。(しかも古い.NET 2.0位までのGenericではない方です。なので最新のOSだと古い.NET Frameworkが必要かも)

ListクラスはGenericなので撃沈しました。
    • good
    • 0
この回答へのお礼

いろいろなプログラム言語できるんですね
うらやましいです。

お礼日時:2018/07/30 07:21

> ジャグ配列とはどういうときに使用するのか



多次元配列で、各次元の要素数が定まらない場合に良く使用します。
データを要素として追加していくので最終的に要素が幾つになるかわからない場合とか?

例えば学校の全生徒の情報を配列に読み込ませて、何かを行いたい場合とか(実際にそういうケースがあるかは知りません)

data = Array() '空の配列を作成
データ読み込み
data(grade)(class)(id)で各データにアクセス
 grade:学年番号
 class:クラス番号
 id:生徒の番号
 当然、各学年のクラス数、各クラスの生徒数は異なります。




> てっきりジャグ配列って

私もNo.4さんと同じ認識です。
だからセル上に作成した表などのデータを処理する場合にはあまり使わないのではないかと思います。


> ジャグ配列
> 配列の配列」の場合、内側の配列について、要素数が揃っていることを要求しないデータ構造であることもある。ジャグ配列 (jagged array)、不規則配列などと言う。
https://ja.wikipedia.org/wiki/%E9%85%8D%E5%88%97 …


VBAだとこんな感じ?


Dim ary As Variant
ary = Array(Array(1, 2, 3), _
      Array(4, 5, 6, 7), _
      Array(8, 9))

MsgBox UBound(ary) '  -> 2
MsgBox UBound(ary(0)) ' -> 2
MsgBox UBound(ary(1)) ' -> 3
MsgBox UBound(ary(2)) ' -> 1

MsgBox ary(0)(0) ' -> 1
MsgBox ary(1)(0) ' -> 4
MsgBox ary(2)(0) ' -> 8

ReDim Preserve ary(UBound(ary) + 1)
ary(UBound(ary)) = Array(10, 11)

MsgBox ary(3)(0) ' -> 10



ListやArrayListがVBAで使用できるということを初めて知りました。いままでは類似のクラスを定義して使用していました。今度試してみます。(確かにReDimは煩わしいですね)
    • good
    • 0
この回答へのお礼

いろいろ、勉強になりました。
有難うございます。

お礼日時:2018/07/30 07:18

No.1です。



私の不勉強ですかね?

No.3さんの
>myPoint = myArr(2, 3)
って多次元配列とは違うのでしょうか?

てっきりジャグ配列って(例題がC#で申し訳ないですが)

int[][] myArr = new int[][]{
new int[]{1,2,3},
new int[]{1,2,3,4},
new int[]{1,2}};

textBox1.Text = myArr[1][3].ToString(); // 4 が表示(Indexは0から始まるのでそれぞれが-1の位置になる)

こうゆうものかと思いこんでました。
    • good
    • 0
この回答へのお礼

C#名前はきいたことありますが、
C#本格的のプログラムですね。
C#はエクセルで使用できるのでしょうか。

お礼日時:2018/07/30 07:19

こんばんは。



ジャグ配列というのは、多段階配列の一種ですが、Excelでは、一般的なもので、表の構造をそのまま写し取れば、シャグ配列になります。配列の中にまた配列があるようなもののです。
添付画像でみたとおり、縦横格子のマトリックス状になっています。

 myArr =Range("A1:D3").Value

● 表を表のままに一気に取り扱う時は便利です。

 myPoint = myArr(2, 3)
は、データが、A1から始まっていれば、myArr(2,3)は、2列の3行目、つまり、B3を表します。

事実上、2次元配列ですから、そのまま扱わない限りは、1次元に戻して扱ったほうが早かったりします。
「ジャグ配列とは」の回答画像3
    • good
    • 1
この回答へのお礼

フォルダの階層みたいです。
フォルダのアドレスの取得等に
利用できるのかな
有難うございます。

お礼日時:2018/07/29 07:20

No.1です。



ただ私の場合ですが、【ReDim】を使うのが面倒なので普通に【2次元配列】で済む事でも【ジャグ配列】を使ったりしますけど。
【Listクラス・ArrayListクラス】などAddメソッドを持つクラスは追加するのも楽ですし。
何より【要素を含んでいるか?】を調べるのも楽ですので。
    • good
    • 1
この回答へのお礼

【Listクラス・ArrayListクラス】これもわからないですが、
非常に気になる
【要素を含んでいるか?】を調べるのも楽
さらに気になる
有難うございます。

お礼日時:2018/07/29 07:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!