投稿者 魔界の仮面弁士  (社会人) 投稿日時 2012/5/26 02:27:25
> 二次元配列をarraylistに入れることは可能でしょうか。
ArrayList に格納されるデータ型は「Object」なので、相手が
String でも Range でも 二次元配列でも五次元配列でもジャグ配列でも
自由に格納できます。求めている答えになっているかは分かりませんが。


> Dim hairetu(2, 2) As String
> hairetu(0, 0) = "0-0"
> hairetu(0, 1) = "0-1"
> hairetu(1, 0) = "1-0"
> hairetu(1, 1) = "1-1"

4項目だけなら、Dim hairetu(1, 1) As String で良いはずですよ。

(2, 2) まで確保しているなら、そこまで文字列を入れておかないと、
未設定の項目は Nothing のままになってしまいます。

hairetu(0, 2) = "0-2"
hairetu(1, 2) = "1-2"
hairetu(2, 0) = "2-0"
hairetu(2, 1) = "2-1"
hairetu(2, 2) = "2-2"


> list.Add(hairetu(0))
文字通りに二次元配列を格納するのであれば、
list.Add(hairetu)
となり、それを取り出すときは、
'MsgBox( list(0)(1, 1) ) 
Dim x(,) As String = DirectCast(list(0), String(,))
MsgBox( x(1, 1) )
という感じになります。まぁ、求めている答えでは無いでしょうけれども…。


二次元構造のままで扱いたいなら、ジャグ配列を真似て、
Dim a As New ArrayList()
Dim x As ArrayList
x = New ArrayList()
x.Add("0-0")
x.Add("0-1")
a.Add(x)
x = New ArrayList()
x.Add("1-0")
x.Add("1-1")
a.Add(x)
'MsgBox(a(1)(0)) 
MsgBox(CStr(DirectCast(a(1), ArrayList)(0)))
あるいは、
Dim a As New ArrayList()
a.Add(New String(){ "0-0""0-1" })
a.Add(New String(){ "1-0""1-1" })
'MsgBox( a(1)(0) ) 
MsgBox(CStr(DirectCast(a(0), String())(1)))
のような形で取り込む手もあります。



とはいえ今となっては、Object でしか管理できない ArrayList を
使うメリットは無いので、List クラスを推奨しておきます。たとえば
Dim a As New List(Of String())
a.Add(New String() {"0-0""0-1"})
a.Add(New String() {"1-0""1-1"})
MsgBox(a(0)(1))

あるいは
Dim a As New List(Of List(Of String))
a.Add(New List(Of String)() From {"0-0""0-1"})
a.Add(New List(Of String)() From {"1-0""1-1"})
a(0).Add("0-2")
a(0).Add("0-3")
MsgBox(a(0)(2))
といった感じです。

そのほか、DataTable で管理するのもおすすめです。
ソートや検索なども容易にできますしね。
http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200808/08080009.txt