• ベストアンサー

arrayListの要素を参照出来ません。

arrayListの要素を参照出来ません。 ( 参照→とり急ぎ、System.out.printlnで表示させたいという事。) JBuilderを使用しているので、値が入っている事は確認出来ました。 arrayListは2次元になっています。 過去の書き込みを見たのですが、応用するまでの理解力がない為か どうもピンと来ません。 周りにはJavaの経験者がいない為、誰にも質問できずに困っています。 ネットでも調べたのですが、上記の理由からかよく分からないのです。 よろしくお願いします。 Windows2000 J2SDKは1.4 JBuilderの8を使用しています。

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

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

見当違いの解答であったら申し訳ありませんが…。 以下の前提で話を進めます。 コンストラクタ等必要なモノはすべて備わっているものとして見てください。 ArrayListに入れるオブジェクトAClass: class AClass {  private String str1;  private String str2;  ... } このインスタンスをArrayListに入れます。 ArrayList list = new ArrayList(); AClass a = new AClass(...); list.add(a); ... リストの中身をすべて表示します。 for (int i=0; i<list.size(); i++) {  System.out.println(list.get(i)); } ここで、System.out.println(Object o)の挙動を説明します。 Javaをある程度理解している方のようなので(失礼がありましたらすみません)直接ソースコードを示して説明します。 System.outフィールドはjava.io.PrintStreamのスタティックインスタンスです。 PrintStream.println(Object x)メソッドを見てみると、 public void println(Object x) { synchronized (this) {  print(x);  newLine(); } } となっています。synchronizedは今は気にしなくていいです。ここで、print(x)をした後に改行しているという事に注目してください。 PrintStream.print(Object obj)メソッドを見てみると、 public void print(Object obj) {  write(String.valueOf(obj)); } と、String.valueOf(obj)を出力しているのがわかります。 引き続きString.valueOf(Object obj)メソッドを見てみると、 public static String valueOf(Object obj) {  return (obj == null) ? "null" : obj.toString(); } となっています。ここで、引数objがnullなら"null"を、そうでなければobj.toString()を返しているのがわかります。 ここで注目すべきは、 AClass a = new AClass(); System.out.println(a); としたときは、a.toString()が出力されるという事です。 AClassは自分で作ったクラスであり、ただクラスを作った段階ではtoString()メソッドは定義されていません。 しかし、AClassは暗黙的にjava.lang.Objectクラスのサブクラスであり、AClassでtoString()メソッドを定義しなかった場合、ObjectのtoString()メソッドが呼び出されます。 ここでしつこくObject.toString()メソッドを見てみると、 public String toString() {  return getClass().getName() + "@" + Integer.toHexString(hashCode()); } となっています。これが呼び出されるので“名前@訳の分からない16進数”が表示されてしまったわけです。 となれば、toString()メソッドをAClass内で定義してやればいいわけです。 class AClass {  ...  public String toString() {   return str1 + ", " + str2;  } } などとすることで、 System.out.println(a); したときに、AClassのtoString()メソッドが呼び出され、その内容がわかりやすい形で出力されるわけです。 toString()メソッドは自分でわかりやすいように実装するといいでしょう。 ついでですが、クラスを実装した際には、toString(), hashCode(), equals(Object o)の3つのメソッドをオーバーライドされることをお勧めします。 (まぁ理由も分からずオーバーライドするほど危険なモノはありませんが…。) これはJavaの基本というか、設計する上で必要になるので理解されるといいと思います。 また、今回の説明に使用したコードはすべてJREに付属しているソースコードです。 これらを見てみるのも理解を深めることにつながります。 最後に長くなりましたが見当違いでしたらお詫びします。

ahirururu
質問者

お礼

お礼が遅くなってしまってすみません。 Senkeidaisuさん、大変ご丁寧にありがとうございます。 自分としては、「ArrayListには、classをセットしていた」・・・事しか分からず、その先をどうやって説明したらいいか全く分かりませんでした・・・。 プログラムをつくる事に精一杯の状態で、なかなか理解する事まで行き届かずにいる日々です。 なので、こういったピンポイントでのご説明はすごくすごくありがたいです。また勉強させていただきます。 >最後に長くなりましたが見当違いでしたらお詫びします。 見当違いなんて事は全くありません! 本当にありがとうございました。

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

その他の回答 (3)

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.3

つまり、 「arrayListの各要素には、Objectの配列が入っている」 ということですね? その前提で話を進めます。 (List等を使うには、入れたオブジェクトの型を把握しておかなければなりません) オブジェクトと、その配列とでは取り扱いがまったく異なります。 まず、「オブジェクトの配列」として取り出してから、 中身を一個一個取り出さなければなりません。 for(int i=0; i<arrayList.size(); i++){ Object[] arr; //オブジェクトの配列 arr = (Object[])arrayList.get(i); //オブジェクトの配列として取り出す for(int j=0; j<arr.length; j++){ //配列の要素ごとに表示する System.out.println((String)arr[j].toString); } } こんな風でできるかな…。 ためしてみてください。

ahirururu
質問者

補足

getterとsetterを使用して、なんとか希望の動きが出来ました。 arrayList自体は、ほとんど理解していないので、結局何がどうだったのか 説明する事が出来ません・・・。 (ご説明頂いた、NO3のfor文もダメだったんです。※java.lang.ClassCastException) キャストで失敗しているので、判明したのは、私が説明した状況と、実際の状況に 大きく違いがある(または、全く違っていた)事でしょうか・・・。 取り急ぎ、動きが出来たので、面倒を見て下さったliar_adanさんにご報告しなくてはと思い書き込みました。 本当にご親切に、ありがとうございました。 時間(心?)のゆとりが出来たら、どういう事だったのかを 補足させて頂ければと思います。 liar_adanさん、本当にありがとうございました。 いろいろと、すごく勉強になりました。 また、宜しかったら質問させて下さい。

全文を見る
すると、全ての回答が全文表示されます。
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.2

>System.out.pritnln(ArrayList); としているので、 System.out.pritnln(arrayList.toString()); とすると、いちおう文字列としては出ると思います。 試してみてください。 それぞれの文字列を別個に取り出したいときは、 Iteratorを使うか、forループを使うかです。 Iteratorを使うのが本式なのですが, ちょっと説明が難しいので、 forを使ってサンプルを表すと、 for(int i=0; i<arrayList.size(); i++){ System.out.println((String)arrayList.get(i)); } のようになります。 質問にあった「arrayListは二次元になってます」というのがよくわかりませんが。

ahirururu
質問者

補足

System.out.pritnln(arrayList.toString()); としても System.out.pritnln(arrayList);の時と変わらず、参照先のアドレスのようなものが表示されました。 具体的には「a.b.c@119dc16」のように表示されます。(a.bの部分は、パッケージ名です。 arrayListは二次元になっているという、私の説明が悪い、もしくは間違っているのがいけないと思うのですが・・。 以下はJBuilderのデバックの内容です。 (1)errDataは実際データが入っているarrayListです。 この中身を見ると、0番目にはデータが入っていて、それ以降~9番目はnullが入っていると思われます。 errData:java.lang.Object[] = java.lang.Object[10] [0] = a.b.d@14a [1]~[9] = null (2)次にその0番目の中身は以下のようになっています。 [0] java.lang.String = "あいうえお" java.lang.String = "かきくけこ" java.lang.String = "さしすせそ" java.sql.Date = "java.sql.data@122" 0番目の中に、さらに4つのデータがはいているので 2次元という表現を使用した次第です。 すごくヘタな説明かと思いますが、伝わりますでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

これだけの情報では確実なことは言えませんが、 たとえばArrayListに入れたのを、AClassのインスタンスとして、aをAClass型の変数として、 a = (AClass)arrayList.get(x); のようにキャストをしているでしょうか? ArrayListに入るのはObject型なので、 入れるのは自由ですが、 取り出すときにキャストが無いと、もとの型として使うことができません。

ahirururu
質問者

補足

聞かれている内容と違った返答だったらすみません。 ArrayListは、クラスのメソッドの戻り値として返ってきます。 それから(多分無理矢理)、System.out.pritnln(ArrayList); としているので、キャストしていません。 これは、どのようにキャストしたらいいのでしょう? ArrayListに含まれるデータは、文字列型です。

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

関連するQ&A

  • ArrayListの要素数の上限

    java で ArrayListの要素数の上限はいくつでしょうか? ネットで検索したところ C# の ArrayList は 2^32 - 1 のようですけど・・・。 たて、よこ 2^64 の巨大な実数値行列があって、これの固有値を求めるプログラムを作ることになっています。 最初は double の2次元配列で行列を作ろうと思ったのですが、double配列の要素数は 2^32-1 個が限界であきらめました。別の方法を探しているところなのです。 パソコンのメモリは24GBにしてOSも64bit Windowsにしたので java が対応できれば大丈夫かと思うのですが・・・ よろしくお願いします。

    • ベストアンサー
    • Java
  • ArrayListのcloneメソッド

    お世話になります。 ArrayListのcloneメソッドなんですが、API上は「ArrayList のインスタンスのシャローコピーを返します。要素自体はコピーされません。 」と記載がありますが、 「ディープコピー」をしているような感じがして、なぜ「シャローコピー」と言っているのか、教えて欲しいです。 しかも、要素自体もコピーされているような…。 自分の理解では、 シャローコピー:コピー元、コピー先で同じオブジェクトを参照する ディープコピー:コピー元、コピー先で違うオブジェクトを参照する 試したソースは以下です。 --------------- import java.util.ArrayList; public class Test { public static void main(String[] args) { ArrayList<String> array = new ArrayList<String>(); array.add("a"); array.add("b"); ArrayList<String> array2 = (ArrayList<String>) array.clone(); array2.add("c"); System.out.println("array:" + array); System.out.println("array2:" + array2); } } --------------- cloneメソッドはシャローコピーなので、array2で「c」がaddされたら、arrayも「c」が追加されて、 array:[a, b, c] array2:[a, b, c] となるはずが、 array:[a, b] array2:[a, b, c] となります。 array、array2は別々のオブジェクトを参照しているような気がします。 恐らく大きな勘違いをしているのかもしれませんが、 調べてもいまいち理解できませんでした。 お手数おかけしますが、よろしくお願い致します。

    • ベストアンサー
    • Java
  • ArrayListを利用する問題

    問題 1.ArrayListのオブジェクトを生成する。 2.「何回入力しますか?」と出力し、標準入力をおこなう。 3.2で入力した回数分、以下の処理を繰り返す。 「n個目の値を入力してください」と出力し、標準入力を行う。(n=ループ回数) 入力された値をArrayListへ格納する。 4.ArrayListのサイズ分、以下の処理を繰り返す。 ArrayListより値を取得する。 取得した値を出力する。 結果 何回入力しますか? 3 1個目の値を入力してください。 hoge 2個目の値を入力してください。 poyo 3個目の値を入力してください。 hoo hoge poyo hoo 自分で書いたプログラム 1 import java.util.ArrayList; 2 import java.io.*; 3 4 class ArrayList2{ 5 public static void main(String[] args) throws IOException{ 6 7 ArrayList list = new ArrayList(); 8 list.add(n); 9 10 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 11 12 System.out.println("何回入力しますか?"); 13 14 String str = br.readLine(); 15 16 int num = Integer.parseInt(str); 17 18 for(int i = n ; i < num; i++){ 19 System.out.println("n個目の値を入力してください。"); 20 21 String str1 = br.readLine(); 22 23 } 24 } 25 } どうもうまくいきませんので教えて下さい。

  • ArrayList の変数をaddしてもアドレスが変化しない

    windowsXP Eclipse3.4で import java.util.ArrayList; ArrayList list = new ArrayList(); Bean bean = new Bean(); list.add(bean); list.add(bean); System.out.println(bean); System.out.println(list); とアドレスを出力してみると beanのアドレスとlist内の二つのアドレスと3つのアドレスが すべて同じになってしまいます。 なにが原因か分からないのですが、分かる方がいましたら教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • ArrayListクラスのインスタンスの宣言について

    まず初めに一言。 今自分が使用している本は3年ぐらいのモノです。 なので、宣言の仕方が変わっているかもしれません。 その上で質問です。 まず、ソースコードを貼り付けます。(JSP) <%@ page language="java" contentType="text/html; charset=Shift_JIS" import=java.util.*"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>配列の挿入、削除(ArrayList)</title> </head> <body> <% //配列を定義する ArrayList array = new ArrayList(); //値をセットする array.add("1111"); array.add("2222"); array.add("3333"); //配列の値を表示する for (int i=0; i<array.size(); i++) { System.out.println("<p>" + (i+1) + "番目:" + array.get(i)); } //値を挿入する array.add(2, "9999"); //3番目の値を削除する array.remove(2); //変更後の配列の値を表示する for (int i=0; i<array.size(); i++) { out.println("変更後" + (i+1) + "番目:" + array.get(i)); } %> </body> </html> ArrayListクラスのインスタンスの宣言はどこか間違っているでしょうか。 Eclipse曰く、 『ArrayListはraw型です。ArrayListの参照はパラメータ化する必要があります。』 という警告が表示されます。 エラーでは無いみたいなのですが、やはり警告されている状態を放っておくのはあまり気持ちいいモノではありません。 そこで、質問です。 この警告を消す方法はあるのでしょうか。 もし、あるのでしたら教えて頂けると幸いです。 どうぞ宜しくお願い致します。

    • ベストアンサー
    • Java
  • ArrayListを使った多次元配列の作成について

    ArrayListで可変長配列を扱っているのですが、 2次元可変長配列を用いる必要が出てきたので、 下記のように変更したのですがうまくいきません。 何が悪いのか教えていただけませんでしょうか? ----------------------------------------- ArrayList cars=new ArrayList(); cars.add("フェラーリ"); cars.add("ポルシェ"); cars.add("メルセデスベンツ"); for(int i=0;i<cars.size();i++){  String str=(String)cars.get(i);  System.out.println(str);} ----------------------------------------- 上記から下記のように変更しました。 ----------------------------------------- ArrayList[] cars=new ArrayList[3]; cars[0].add("フェラーリ"); cars[0].add("ポルシェ"); cars[0].add("メルセデスベンツ"); for(int i=0;i<cars[0].size();i++){  String str=(String)cars[0].get(i);  System.out.println(str);} ----------------------------------------- エラーは「Exception in thread "main" java.lang.NullPointerException」です。 どうやら初期配列が10ではなく3となってしまっているようです。

    • ベストアンサー
    • Java
  • ArrayList でスタックを

    初歩的でツマラナイかもしれません。 import java.util.ArrayList; でスタックを実現するクラス"MyStack"を書きました。 フィールドは private ArrayList<Integer> stack = new ArrayList<Integer>(); のみという条件です。 MyStack.java - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - import java.util.ArrayList; public class MyStack {   private ArrayList<Integer> stack = new ArrayList<Integer>();      // データを先頭に追加   public void push( int item ) {     stack.add( item );   }   // 先頭のデータを取り出す   public int pop( ) {     int rtn;     if( stack.isEmpty() ) {       System.out.println( "スタックは空です." );       System.exit( 1 );     }          rtn = stack.get( 0 );     stack.remove( 0 );     return rtn;   } } このMyStackを実行するクラス"MainForMyStack"を書きます。 実行結果は、標準出力に 43210 と出ることを想定しています。 MainForMyStack.java - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - import java.util.ArrayList; public class MainForMyStack {   public static void main(String[] args) {     MyStack stack = new MyStack();     // 0,1,2,3,4 をスタックに追加     for( int i=0; i < 5; i++ ) {       stack.push( i );     }     // スタックのデータを先頭から取り出す     for( int i=0; i < stack.size(); i++ ) {       System.out.print( stack.pop() );     }   } } さて、MainForMyStack.java の i < stack.size(); の箇所でエラーが出るのはなぜでしょう? どなたかご教授の方お願いします。

    • ベストアンサー
    • Java
  • ArrayListを使ったクラスの作成の仕方

    次のプログラム、どこが間違っているのでしょうか? コンパイルは通るのですが、実行しようとすると ずら~っとエラーが出てしまいます。 (例)at java.lang.ClassLoader.defineClass1(Native Method) at java.security.SecureClassLader.defineClass..... at java.net.URLClassLoader.defineClass(URLClassLoader.java:260) ********************************************************** package siryou; import java.util.ArrayList; import java.io.*; class Info { private String name; private String age; private String nationality; public void setName(String nm) { name = nm; } public void setAge(String a) { age = a; } public void setNationality(String nt) { nationality = nt; } public void show(String j) { System.out.println("「名前=" + name + "」"); System.out.println("「年齢=" + age + "」"); System.out.println("「国籍=" + nationality + "」"); } } class Kojinjyoho02 { public static void main(String args[])throws IOException { System.out.println("何回入力しますか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int res = Integer.parseInt(str); Info in = new Info(); ArrayList list = new ArrayList(); for(int i =0; i < res; i++){ System.out.println("名前は?"); str = br.readLine(); in.setName(str); System.out.println("年齢は?"); str = br.readLine(); in.setAge(str); System.out.println("国籍は?"); str = br.readLine(); in.setNationality(str); list.add(in); } for(int j=0; j < list.size(); j++){ String jyoho = (String)list.get(j); in.show(jyoho); } } }

    • ベストアンサー
    • Java
  • C#.NET ArrayListの使用方法について

    C#.NETを使用しています。ArrayListを宣言、インスタンス化し、 "別々の値を持つ"要素20個をAdd(追加)しているはずなのですが、 要素を取り出して、値を見てみると"同じ値"になってしまっています。 自分なりに考えたのですが原因がわかりません。 どなたかご教授お願いします。 書いたソースは以下のような感じです。 public class Area{ _____// リスト _____public ArrayList list; _____//コンストラクタ _____public Area(){ _________ list = new ArrayList(); __________//要素の作成は以下で行う __________for(int cnt=0;cnt<20;cnt++){ ___________ AddNodeList(new 要素); } _____} _____public void AddNodeList(要素){ _______要素型 a = 要素; _______list.Add(a); _____} }

  • JAVAで配列の要素に、負の値が入力されたらに再入力させたいです

    JAVAで多次元配列の要素に、負の値が入力されたらに再入力させたいです int[][] a = new int[10][10]; ↑このような配列を扱うので、以下のような変数にたいしてfor文を使ったシンプルな方法は使い勝手が悪いです。 何か良い方法はありませんか? ------------------------------------------------------------------- int x = 0; for (int i = x; x <= 0;) { System.out.println("番号 : "); x = stdIn.nextInt(); }