アプリ版:「スタンプのみでお礼する」機能のリリースについて

arrayListの要素を参照出来ません。
( 参照→とり急ぎ、System.out.printlnで表示させたいという事。)
JBuilderを使用しているので、値が入っている事は確認出来ました。

arrayListは2次元になっています。

過去の書き込みを見たのですが、応用するまでの理解力がない為か
どうもピンと来ません。
周りにはJavaの経験者がいない為、誰にも質問できずに困っています。
ネットでも調べたのですが、上記の理由からかよく分からないのです。
よろしくお願いします。

Windows2000
J2SDKは1.4
JBuilderの8を使用しています。

A 回答 (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に付属しているソースコードです。
これらを見てみるのも理解を深めることにつながります。


最後に長くなりましたが見当違いでしたらお詫びします。
    • good
    • 1
この回答へのお礼

お礼が遅くなってしまってすみません。
Senkeidaisuさん、大変ご丁寧にありがとうございます。
自分としては、「ArrayListには、classをセットしていた」・・・事しか分からず、その先をどうやって説明したらいいか全く分かりませんでした・・・。

プログラムをつくる事に精一杯の状態で、なかなか理解する事まで行き届かずにいる日々です。
なので、こういったピンポイントでのご説明はすごくすごくありがたいです。また勉強させていただきます。

>最後に長くなりましたが見当違いでしたらお詫びします。
見当違いなんて事は全くありません!
本当にありがとうございました。

お礼日時:2003/10/02 13:01

つまり、


「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);
}
}

こんな風でできるかな…。
ためしてみてください。

この回答への補足

getterとsetterを使用して、なんとか希望の動きが出来ました。
arrayList自体は、ほとんど理解していないので、結局何がどうだったのか
説明する事が出来ません・・・。
(ご説明頂いた、NO3のfor文もダメだったんです。※java.lang.ClassCastException)
キャストで失敗しているので、判明したのは、私が説明した状況と、実際の状況に
大きく違いがある(または、全く違っていた)事でしょうか・・・。

取り急ぎ、動きが出来たので、面倒を見て下さったliar_adanさんにご報告しなくてはと思い書き込みました。
本当にご親切に、ありがとうございました。

時間(心?)のゆとりが出来たら、どういう事だったのかを
補足させて頂ければと思います。

liar_adanさん、本当にありがとうございました。
いろいろと、すごく勉強になりました。
また、宜しかったら質問させて下さい。

補足日時:2003/08/06 21:06
    • good
    • 0

>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は二次元になってます」というのがよくわかりませんが。

この回答への補足

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次元という表現を使用した次第です。
すごくヘタな説明かと思いますが、伝わりますでしょうか?

補足日時:2003/08/06 17:45
    • good
    • 0

これだけの情報では確実なことは言えませんが、


たとえばArrayListに入れたのを、AClassのインスタンスとして、aをAClass型の変数として、

a = (AClass)arrayList.get(x);

のようにキャストをしているでしょうか?

ArrayListに入るのはObject型なので、
入れるのは自由ですが、
取り出すときにキャストが無いと、もとの型として使うことができません。

この回答への補足

聞かれている内容と違った返答だったらすみません。
ArrayListは、クラスのメソッドの戻り値として返ってきます。
それから(多分無理矢理)、System.out.pritnln(ArrayList); としているので、キャストしていません。

これは、どのようにキャストしたらいいのでしょう?
ArrayListに含まれるデータは、文字列型です。

補足日時:2003/08/06 16:32
    • good
    • 0

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