• ベストアンサー

ArrayListへArrayListの格納

お世話になっております。 ArrayListを2つ使用して2次元配列のような事をしようとしております。 データベースから取得したデータの1行をArrayListItemへ格納してそのArrayListItemをArrayListRecordへ格納しようとしております。 追加し終わり最後にArrayListRecordの中身を見ると全て一番最後のデータで置き換わっています。 どなたかご存知でしたらお教え願います。 ' 変数宣言 Dim objSqlDR As SqlDataReader Dim alSetItem As ArrayList Dim alSetRecord As ArrayList alSetItem = New ArrayList alSetRecord = New ArrayList ' データ取得分ループ While objSqlDR.Read()  alSetItem.Clear()  For intSetIndex = 0 To (objSqlDR.FieldCount - 1)   alSetItem.Add(objSqlDR(intSetIndex))  Next intSetIndex  alSetRecord.Add(alSetItem) End While

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

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

alSetRecord.Add(alSetItem) これは alSetItem の現在の値を alSetRecord に追加しているのではなく、alSetItem へのポインタを alSetRecord に追加しています。 よって alSetRecord に alSetItem のポインタがいくつ追加されようとも、全ては「ただ 1つの」alSetItem オブジェクトを指してしまうわけです。 そして alSetItem の中身はというと、最後のループで登録された中身なわけです。 alSetRecord.Add(alSetItem) これを alSetRecord.Add(alSetItem.Clone()) とするとか。

その他の回答 (1)

noname#25358
noname#25358
回答No.1

 全てのレコードを個別に保持したいならば、ArrayList は1レコードずつ new しなければいけません。  この例では、while 直後の clear() によって、データが全て消えてしまっています。  end while 直前の .add() によって行われているのは、「クラス alSetItem をレコードとして登録する」という動作であり、値そのものをポイッと放り込んでいるわけではありません。  よって、この例を正しく修正するには、"alSetItem = New ArrayList" の行を、while の直後に移動します。

関連するQ&A

  • ArrayListの初期値に二次元配列を設定したい(VB2005)

    下記は、aryhogeにTextBoxオブジェクトを格納する処理です。 ---------------------------------------- 'a) Dim hoge()() As TextBox = _       {New TextBox() {txta01, txtb01, txtc01}, _       New TextBox() {txta02, txtb02, txtc02}, _       New TextBox() {txta03, txtb03, txtc03}} Dim aryhoge As New ArrayList    'b) aryhoge.Add(hoge(0)) aryhoge.Add(hoge(1)) aryhoge.Add(hoge(2)) ---------------------------------------- (a)を(b)の初期値として設定するにはどのようにすればよいか、ということが質問内容です。 試しに(b)の部分を以下のようにしてみましたが、「1次元配列の値を変換できない」とのエラーが出ました。 Dim aryhoge As New ArrayList(New TextBox() {hoge(0), hoge(1), hoge(2)}) どうぞよろしくお願い致します。

  • ArrayListに多次元配列

    ArrayListに多次元配列の変数を格納したのですが、取り出し方がわからず困っています。 ----------------------------------------------- String[][] str = {{"aaa","bbb","ccc","ddd","eee","fff"}, {"aaa","bbb","ccc","ddd","eee","fff"}, }}; ArrayList array = new ArrayList(); array.add(str[0]); array.add(str[1]); ----------------------------------------------- 上記の場合で、str[0][2];を取得する方法がわかりません。 java初心者なのでおかしな質問かもしれませんが、宜しくお願いします。

    • ベストアンサー
    • Java
  • (VB2005) ArrayListへの実体(値型変数)格納について

    先刻も質問させてもらい、redfox63さま、KGさまに 回答いただきありがとうございました。 ArrayListに参照型データが格納されているようであることが判明しました。 ではArrayListに値型(変数の実体)を格納するにはどうすればいいでしょうか? 【前提】 ・処理の中で構造体変数XXXが更新される。 ・XXX更新の都度、Undo用ArrayListのAListにXXXを保存する関数をコールする。 Dim XXX as New AAA Dim AList as NEW ArrayList  XXX <--- 処理の中で更新がかかるとともに、保存関数XXX_Updateをコールする。 Private Function XXX_Update( )  Dim XXX_Buf as AAA  XXX_Buf = NEW AAA  XXX_Buf = XXX …(1)  AList.Insert(0,XXX_Buf) …(2) End Function このような関数ではAListにXXXへの参照データが入ってしまい、 過去に保存したはずのItemすべてが現在のXXXになってしまいます。 ということはAListに格納されているデータはすべて 現在のXXXを参照するデータになっているということですね? AListにXXXの実体(値型)を格納するにはどうすればいいでしょうか? DirectCastが値型と参照型の変換という説明を見つけたので使ってみましたが、 うまくいきませんでした。  (1)⇒ XXX_Buf = DirectCast(XXX, AAA)  (2)⇒ AList.Insert(0,DirectCast(XXX_Buf,AAA)) 原因や解決法などおわかりの方いましたら、回答よろしくお願いします。

  • VB.NETの配列とArrayListについて教えてください。

    VB.NETで配列にPoint型のデータを入れたいのですが、 ArrayListのAddメソッドのように総数をあらかじめ指定せずに 順次追加するように登録していきたいのですが、 そのようなことは可能でしょうか? 最終的には Dim points As Point() g.DrawLines(Pens.Black, points) の方法で線分を描きたいのですが、 ArrayListですとデータ型が指定できないので Point型のデータを格納できないです。 良い方法がありましたら、ご教示頂けると助かります。

  • Generic.Listに1次元配列の配列を格納したい(VB2005)

    VB2005の質問です。 変数ghogeにString型の1次元配列の配列を格納したいと考えています。 ----------------------------------------------- 'a) Dim hoge()() As string = _       {New string() {"a1", "b1", "c1"}, _       New string() {"a2", "b2", "c2"}, _       New string() {"a3", "b3", "c3"}} Dim ghoge As New Generic.List(of )   'b) MessageBox.Show(ghoge(1)(1))      ' "b2"と表示したい ----------------------------------------------- 質問内容は、(a)を(b)の初期値として設定するにはどのようにすればよいか、ということです。 (b)がGeneric.ListでなくArrayListの場合だと、   Dim ghoge As New ArrayList(hoge) でhoge配列を格納できますが、Generic.Listの場合はどのような構文にすればよいでしょうか。 現在は、下記のような処理でghogeに値を格納しています。 ------------------------------------------------------------ Dim ghoge As New Generic.List(Of Generic.List(Of String)) Dim aryhoge1 As New Generic.List(Of String)(New String() {"a1", "b1", "c1"}) Dim aryhoge2 As New Generic.List(Of String)(New String() {"a2", "b2", "c2"}) gary_hoge.Add(ary_hoge1) gary_hoge.Add(ary_hoge2) MessageBox.Show(gary_hoge(1)(1))    ' "b2"と表示される ------------------------------------------------------------ どうぞよろしくお願い致します。

  • ArrayListに格納したクラス内のメンバの呼び出し方法(VB)

    お世話になります。VB2003でご質問があります。 通常Arryalistでは下記例1のように使用するのが一般的だと思うのですが、例2のようにArryaListにクラスを追加し、その中のメンバを呼び出すにはどのようにコーディングすればよいのでしょうか? コメントのコンパイルエラー箇所の部分です。 お手数ですが、ご教授よろしくお願いいたします。 ******************************************* (例1) Dim Test as new ArrayList Test.ADD("テスト") console.writeline(test(0)) ******************************************* ******************************************* (例2) Public Class A public strA as string public sub subTest() strA = "おはよう" end sub End Class Public Class B Dim a as new ArrayList a.Add(new A) a(0).subTest '--コンパイルエラー箇所 console.writeline(a(0).strA) '--コンパイルエラー箇所 End Class *******************************************

  • JAVA 配列を格納したArrayListのサイズ

    ArrayListにcsvファイルを格納する処理を作成しました。 読み込みはBufferedReaderで行単位で読み込ませ、 ArrayListの各要素には各行をカンマ区切りでわけた配列を 入れてあります。 ここで読み込むcsvファイルがデータなしの時にデータがないことを コメントする処理を入れたいのですが、ArrayListのサイズが0であるという 条件を思いつき、「length」や「size()」で条件文を作成したところ、 コンパイルされても処理が正常に走りませんでした。 条件にしている箇所があっているのか間違っているのか。 あっているならば、配列をしまってあるArrayListの要素数を 得る方法、間違っているならば、正しい条件を教えてください。 大変恐縮ですが、ご助言お願いいたします。 inName : 取り込みファイル名(argsで引っ張っています。) outName : はき出しファイル名(同上) ExceptionはIOとFileNotFoundをcatchしています。 try{ bf = new BufferedReader(new FileReader(inName)); outbf = new BufferedWriter(new FileWriter(outName)); String line; while((line = bf.readLine()) != null){ al.add(line.split(",",0)); /*for(int i=0 ; i < data.length ; i++){ al.add(data[i]); }*/ //行数0の処理を記述しようとしている箇所 } for(String[] out : al){ for(int i=0 ;i<out.length ; i++){ outbf.write(out[i]); outbf.newLine(); } } }

  • Struts ArrayListデータの画面出力方法

    MySQLのテーブルデータを下記の様にActionとFormにコーディングして取得し、それをフォームに格納するところまでできました。 -----アクション(抜粋)----------------------------------- ArrayList tmpArrayList = new ArrayList(); int n=0; while(rs.next()){ tmpArrayList.add(rs.getString("id"));   n++; } aform.setIdall(tmpArrayList); -------------------------------------------------- -----フォーム(抜粋)----------------------------- private ArrayList idall; public ArrayList getIdall() { return idall; } public void setIdall(ArrayList idall) { this.idall=idall; } -------------------------------------------------- この後、idallに格納したデータをJSP画面に表示させるにはどうコーディングすればいいのでしょうか? JSPファイルに<logic:iterate>と<bean:write>を使って表示させたいのですが・・・。 ご指導のほどよろしくお願いいたします。

    • ベストアンサー
    • Java
  • listの格納されている値をGridViewに追加

    下記のようなロジックを動かそうとしていますが、うまくいきません。 「データベースからinteger型の値を取得して、それをreadメソッドでlistに一旦格納し、For Eachで1つずつGridviewに追加していく。」 エラー内容でググっても良くわからなかったので、解決策がわかる方がいましたらご助言お願い致します。。 *DBから値を取得し、listに格納するところは問題なく動いていますが、Gridviewに追加するところでこけます。 エラー箇所:GridView1.Columns.Add(item) エラー内容:「型 'Integer' の値をを 'System.Web.UI.WebControls.DataControlField' に変換できません。」 Dim list As List(Of Integer) = New List(Of Integer) Dim result As Integer = Byte.MinValue Do While testReader.Read() result = Convert.ToInt32(testReader("price")) list.Add(result) Loop For Each item In list GridView1.Columns.Add(item) Next

  • ArrayListにArrayListを用いた場合の対応について

    public static ArrayList<Integer> f1 = new ArrayList<Integer>(); public static ArrayList<ArrayList> f2 = new ArrayList<ArrayList>(); public void parse(Context ct){   if(ct.match("f")){ ct.nextToken(); while(ct.currentToken() != null && ct.currentToken().matches("[0-9]+/[0-9]*/[0-9]+")){ f1.add(ct.fToken(ct.currentToken())); ct.nextToken(); } f2.add(f1); f1.clear(); System.out.println(f2); 例f⇒f 1/4/3 2/5/6 4/5/6  1行⇒[1,2,4]  1/3/5 7/1/2 8/3/4  2行⇒[1,7,8]         ・         ・         ・   回答例⇒[[1,2,4],[1,7,8],[…],…,[…]] 上記のようなobj形式のf行をそれぞれ1行ごとに頭文字を取り出して(Contextで)、f1=ArrayList<Integer>にaddしていき、1行を読み終わったらf1=ArrayList<Integer>をf2=ArrayList<ArrayList>にaddしていき、最終的には回答例のような形にしたいです。 私はf1にaddした数字をf2にf1をaddして、その後f1をclearしてその空いたf1にまた次の行の数字をaddさせるつもりだったのですが、f1をクリアしてしまうと一度f2にaddしたはずのものも消えてしまうことに気づきました。 どのように改造すれば回答例のようにf2のArrayListにf1のArrayListをいくつもいれて表示することができますか。 教えてください。

専門家に質問してみよう