ここから質問投稿すると、最大4000ポイント当たる!!!! >>

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となってしまっているようです。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

こんにちは。



>ArrayList[] cars=new ArrayList[3];
はArrayList型のオブジェクトのインスタンス
を格納する箱を3個作成しただけなので、
この時点では、
cars[0] = null
cars[1] = null
cars[2] = null
となっています。ですから、当然
cars[0].add("フェラーリ");
などとやると、NullPointerExceptionが
発生します。これをさけるには、
cars[0] = new ArrayList();
cars[1] = new ArrayList();
cars[2] = new ArrayList();
とする必要があります。
    • good
    • 3
この回答へのお礼

返信が非常に遅れてしまい申し訳ありませんでした。
みなさんの回答、大変参考になりました。
さっそく書き直してみることにします。

argiさんの質問ですが、可変長配列×可変長配列を作ろうとしています。

お礼日時:2005/03/14 10:53

ArrayListの配列は一個作れば充分でしょう。


下記を参考にしてください。
import java.util.*;
class Cars {
public static void main(String args[]){
ArrayList[] cars=new ArrayList[1];
cars[0]=new ArrayList();
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);
}
}
}
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
参考にさせていただきます。

お礼日時:2005/03/14 10:57

質問内容に質問ですが、


固定長配列×可変長配列 を作ろうとしていますか?
可変長配列×可変長配列 を作ろうとしていますか?

例外が発生している原因は#1の方の回答でOKだと思いますが、根本的にどちらなのでしょうか?
    • good
    • 2
この回答へのお礼

回答の場所を間違えてました・・。
可変長配列×可変長配列を作ろうとしています。

お礼日時:2005/03/14 10:55

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QIOException ってどういうときに起こるのでしょうか?

IOException ってどういうときに起こるのでしょうか?

http://www.atmarkit.co.jp/fjava/rensai2/javaent12/javaent12.html
を見て勉強しています。

  catch ( IOException e) {
    System.out.println( "キーボードが故障しているのかもしれません" );
  }

と書いてあります。
ハード(キーボード)が故障しているのを Java のプログラムのレベル(ソフトウェア)で感知できるというのがよくわかりません。「

NumberFormatException の方はわかるのですが・・・

Aベストアンサー

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接続だったりするわけですけど、
InputStreamは、その入力元の情報を持っていないので、
データを読み取る際は常に
IOExceptionをキャッチするコードを書かなくてはいけません。
たとえ、絶対にIOエラーが発生しないストリームだとしても。

さらに付け加えるなら、
そもそも「標準入力=キーボード」であるとは限りません。
(一般的にはキーボードであることが多いですが。)
Javaでは、
System.setIn(InputStream)
を呼び出して、標準入力を変えてしまうことができますし、
標準入力を指定してプログラムを実行することができるOSもあります。

追伸1:
例外をキャッチしたときは、
スタックトレースをプリントすることをおすすめします。
catch (IOException e) {
e.printStackTrace();
}

追伸2:
そのプログラムでIOExceptionを発生させる最も簡単な方法は、
readLine()を呼び出す前に
標準入力(System.in)を閉じてしまうことです。
System.in.close();

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接...続きを読む

Q動的配列確保

JAVA初心者です。
VBでのRedim Preserve、CのreallocみたいなものはJAVAには無いのでしょうか?
要はあらかじめ配列数がわかっていない時に動的配列確保を行いたいのです。
Objectではなく、基本クラスのint、byte等の配列に使いたいと思っております。
ArrayListが近い事が出来そうだったのですが、Objectにしか使用出来ないので、
断念しました。教えてください。

Aベストアンサー

ラップするというのは、こんな感じです。

byte value = 1;
ArrayList list = new ArrayList();
list.add(new Byte(value));

byte や int に対応する、java.lang.Byte や java.lang.Integer などのクラスを使います。例えば new Byte(3) とやると、3 の byte 値を持つ Byte クラスのオブジェクトができます。あくまでもオブジェクトですので、そのままでは足し算や掛け算はできませんが、ArrayList にオブジェクトとして追加できるようになります。

オブジェクトから元の数値に戻すには、byteValue() や intValue() などのメソッドが各クラスに用意されているのでそれを使います。

もちろん、質問者さんが補足に書いたように、文字列に変換して ArrayList にいれる方法でもかまいません。ただし、Byte や Integer クラスのオブジェクトを使うと、
○「文字列⇔数値」の相互変換の必要が無いので、(一応)速い。
○元の数値が byte だったのか、int だったのか、short だったのか、…… が判別できる。
などの利点があります。

ラップするというのは、こんな感じです。

byte value = 1;
ArrayList list = new ArrayList();
list.add(new Byte(value));

byte や int に対応する、java.lang.Byte や java.lang.Integer などのクラスを使います。例えば new Byte(3) とやると、3 の byte 値を持つ Byte クラスのオブジェクトができます。あくまでもオブジェクトですので、そのままでは足し算や掛け算はできませんが、ArrayList にオブジェクトとして追加できるようになります。

オブジェクトから元の数値に戻すには、byteValue() や...続きを読む

QJAVA  ArrayListからArrayListへのコピー

java で、ArrayListからArrayListへコピーはできるのでしょうか?
clone()というメソッドがありましたが、よくわからず、コピーできてないようなので伺いました。

ベーシックではできるようですが、JAVAでもできるのでしょうか?
どなたか教えていただけませんでしょうか?

Aベストアンサー

ArrayList li = new ArrayList(list);
でよいでのでは?

Qequalsの逆

javaで、文字列の場合は比較演算子の「==」は用いずに

if ((str1.getText()).equals(str2)){
(※…str1,2は文字列)

と書きますよね?
この逆で、文字列str1とstr2は等しくないとき、にはif以下の条件文をどのように書けばよいでしょうか?

Aベストアンサー

>if !((str1.getText()).equals(str2)){

あくまで
if(){
}


!(str1.getText()).equals(str2)
が入っているので
if !((str1.getText()).equals(str2)){
じゃなくて
if (!(str1.getText()).equals(str2)){
こう。

Qcsvファイルを2次元配列に格納

Javaの勉強をしています。
csvファイルを読み込んで2次元配列に格納する方法を教えて下さい。
1次元の配列なら下記のようにして出来たのですが、2次元の配列に格納する方法が分かりません。

------------------------------
try {
File csv = new File("xxx.csv");
BufferedReader brf = new BufferedReader(new FileReader(csv));
while(brf.ready()) {
String line = brf.readLine();
String[] data = line.split(",");
for(int j=0; j<data.length; j++) {
System.out.print(data[j] + "\t");
}
System.out.println();
}
brf.close();
} catch(FileNotFoundException e) {
e.printStackTrace();
} catch(IOException e) {
e.printStackTrace();
}
---------------------------
一度はできないのかと思い、上記の1次元配列のdata[j]を2次元配列のarray[i][j]に代入してみたのですが出来ませんでした。
回答宜しくお願い致します。

Javaの勉強をしています。
csvファイルを読み込んで2次元配列に格納する方法を教えて下さい。
1次元の配列なら下記のようにして出来たのですが、2次元の配列に格納する方法が分かりません。

------------------------------
try {
File csv = new File("xxx.csv");
BufferedReader brf = new BufferedReader(new FileReader(csv));
while(brf.ready()) {
String line = brf.readLine();
String[] data = line.split(",");
for(int j=0; j<data.length; j++) {
System.out.pr...続きを読む

Aベストアンサー

#1です。

> ファイル全体の行数はファイルを読み終わってからでないとわからないのですが、その場合どうすればよいのでしょう??

#2の方が書いておられるように、ArrayListなど適当なコレクションクラスにファイルを読み込み、行数が分かってから配列をnewすればいいでしょう。

import java.util.ArrayList;

ArrayList<String[]> al = new ArrayList<String[]>();
while (...) {
String line = brf.readLine();
al.add(line.split(",")); /* ArrayListへ読み込み */
}

String[][] array = new String[al.size()][];
for (i = 0; i < al.size(); i++) {
array[i] = al.get(i); /* ArrayListから配列へ */
}

勉強頑張ってください。

Qクラス間でのデータ参照

あるクラスでArrayListにデータを格納し、そのデータを別のクラスで使いたいと思っています。

Javaでそれをするために、どのようにすればよいのでしょうか?

何か知識がある方教えてください。

Aベストアンサー

> つまり、教えてもらった方法は、
> *リストを作るクラス
> *そのリストを使って処理をするクラス
> *命令を出すクラス
> の三つに分かれているということですか?

はい、
Aru: リストを作るクラス
Betsu~3: そのリストを使って処理をするクラス
です。

別のクラスがあるクラスのインスタンスの生成から管理していれば,
命令を出すクラスを作らずともかまいません。
class Betsu4 {
public void shori() {
Aru aru = new Aru();
aru.createList();
ArrayList list = aru.getList();
}
}

Qシンボルが見つかりませんというエラーが理解できません。

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Image[3];
Thread t;
int index1 = 0;
int index2 = 0;
String msg = "";
String msg1 = "";

boolean state = false;
Button b1 = new Button("ぐー");
Button b2 = new Button("ちょき");
Button b3 = new Button("ぱー");

public void init(){
for(int i = 0; i<=2; i++){
img[i] = getImage(getDocumentBase(),"hanabi" + (i+1) + ".JPG");
}
add(b1);
add(b2);
add(b3);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
msg1 = "結果は・・";

}

public void paint(Graphics g){
g.drawImage(img[index1],350,30,this);
g.drawImage(img[index2],695,30,this);
g.drawString("コンピューター",420,300);
g.drawString("あなた",800,300);
g.drawString(msg,630,320);
g.drawString(msg1,550,320);
}

public void start(){
state = true;
t = new Thread(this);
t.start();

}

public void run(){
while(state){
index1++;
if(index1 == 3){
index1 = 0;
}
index2++;
if(index2 == 3){
index2 = 0;
}
repaint();
try {
Thread.sleep(60);
}catch(InterruptedException e) { }
}
}

public void actionPerformed(ActionEvent e){
if(state == false) {
start();
return;

}
state = false;
if(e.getSource() == b1) {
msg = "ぐー";
index2 = 0;
}

else if(e.getSource() == b2){
msg = "ちょき";
index2 = 1;
}

else if(e.getSource() == b3){
msg = "ぱー";
index2 = 2;
}
check();
repaint();
}

public void check() {
if(index1 == index2) msg ="あいこ";


else if (index1 == 0) {
if(index2 == 2) msg="あなたの勝ち";
else msg ="あなたの負け";
}

else if(index1 == 1) {
if(index2 == 0) msg="あなたの勝ち";
else msg="あなたの負け";
}

else if(index1 == 2) {
if(index2 == 1) msg="あなたの勝ち";
else msg="あなたの負け";
}

}
}

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Imag...続きを読む

Aベストアンサー

「シンボルを見つけられません。」というエラーの下に何か表示がありませんでしたか?そこにヒントがあると考えられます。
シンボルを見つけられませんといエラーが表示される主な理由は4つあります。
(1)クラス、メソッド、変数などの綴りミスや定義していない変数を使用している可能性がある。
(2)コンストラクタを呼び出すときに、newを忘れている可能性がある。(3)公開されていないメンバーを呼び出している可能性がある。
(4)必要なimport文を記述し忘れている可能性がある。
ここでのあなたのエラーは(1)番ではないでしょうか?上記ではimageとなっている変数がimgになっていますね。
これはエラー表示をよく見ることで意外と簡単に解決できるのです。
ゆっくり丁寧にエラー表示を見るように心がけることが大事ですよ。

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

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

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

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

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

Aベストアンサー

見当違いの解答であったら申し訳ありませんが…。
以下の前提で話を進めます。

コンストラクタ等必要なモノはすべて備わっているものとして見てください。

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


最後に長くなりましたが見当違いでしたらお詫びします。

見当違いの解答であったら申し訳ありませんが…。
以下の前提で話を進めます。

コンストラクタ等必要なモノはすべて備わっているものとして見てください。

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.pr...続きを読む

QC# ArrayListを二次元配列のように使用したい。

C#についての質問です。

現在、ArrayListを用いた情報管理リストのプログラムを作成しています。
そのプログラムにソートを行う機能と、検索機能をつけたいのですが、そこで質問です。
ArrayList内の要素を、「特定のフィールド(例えば氏名であったり、年齢であったりするのですが…)を基準として昇順または降順にソートする」という処理、またあるフィールドのみを基準に検索を行うという処理を行う際、ArrayListを二次元配列のように使用することが出来たら便利だな、と思ったのですが、そのようなことは可能でしょうか?

いろいろと試したり、独自に調べてはみたのですが、いまいちわからず、質問させていただきました。

お分かりになられる方がいらっしゃいましたら、ご教授いただければと思います。
よろしくお願いいたします。

Aベストアンサー

ArrayListを継承した独自のクラスを定義して[]のインデクサを定義すれば可能でしょう

class Person {
  private string name;
  private int age;
  Person( string sName, int nAge ) {
    Name = sName;
    Age = sAge;
  }
  public Name {
    get { return name; }
    set ( name = value; }
  }
  public Age {
    get { return age; }
    set { age = value; }
  }
}

class myAL : ArrayList
{
  public virtual object this[ int nIndex, int nType ] {
    get {
      object obj = this[nindex];
      // Namespaceは実際のNamesapceに置換してください
      if ( obj.GetTye() == Type.GetType( "NameSpace.Person" ) ) {
        Person p = (Person)obj;
        switch( nType ) {
        case 0:
          return p.Name;
        case 1:
          return p.Age;
        }
      }
      // nTypeが0または1以外 および objがPerson以外の型
      return null;
    }
  }
}
といった具合の実装で ・・・

ArrayListを継承した独自のクラスを定義して[]のインデクサを定義すれば可能でしょう

class Person {
  private string name;
  private int age;
  Person( string sName, int nAge ) {
    Name = sName;
    Age = sAge;
  }
  public Name {
    get { return name; }
    set ( name = value; }
  }
  public Age {
    get { return age; }
    set { age = value; }
  }
}

class myAL : ArrayList
{
  public virtual object this[ int ...続きを読む

Qservletからjspへオブジェクトの配列情報を送る方法

いつもお世話になっております。echo2002です。

さて、今回は以下のような処理を行いたいのですが、可能なのでしょうか?
”servletで作成したオブジェクトの配列をjspにforwardして表示させる”

こんなような処理を考えています。

構成:FileListServletクラス, FileInfomationクラス, disp.jsp

FileInfomationクラスではファイル名やファイルサイズなどの情報を持ち、
それぞれgetなどのアクセサメソッドを持つとします。

FileListServletクラスでの処理
FileInfomationクラスの配列を作成し、各情報をsetする。
HttpServletRequestにsetAttributeでFileInfomation情報を付加し、
disp.jspへforwardする。

※以下の方法を考えています。
request.setAttribute("fileinfo1", fileinfo[0]);
request.setAttribute("fileinfo2", fileinfo[1]);
request.setAttribute("fileinfo3", fileinfo[2]);
・・・
(配列でsetAttributeできるのかわからなかったので、
 とにかくファイルの数分setAttributeしてみました)

getServletContext().getRequestDispatcher("/disp.jsp").forward(req, res)

わからないこと:
disp.jspでどのようにFileInfomationの情報を取得し、
内容を参照できるのかがよくわからないのです。
jspの暗黙オブジェクトrequestを使用して、request.getParameterをすると、
返ってくる値がStringのようなので、FileInfomationクラスにならないんですよね?

突っ込みどころ満載の質問かと思いますが、何かアドバイス頂ければと思います。
オブジェクトの配列をsetAttributeしてjspで読み出せる方法があれば、
それもご教授いただけますでしょうか。
よろしくお願いいたします。jsp難しいです・・・。

いつもお世話になっております。echo2002です。

さて、今回は以下のような処理を行いたいのですが、可能なのでしょうか?
”servletで作成したオブジェクトの配列をjspにforwardして表示させる”

こんなような処理を考えています。

構成:FileListServletクラス, FileInfomationクラス, disp.jsp

FileInfomationクラスではファイル名やファイルサイズなどの情報を持ち、
それぞれgetなどのアクセサメソッドを持つとします。

FileListServletクラスでの処理
FileInfomationクラスの配列を作成し、...続きを読む

Aベストアンサー

setなんちゃらメソッドで値を設定したら、getなんちゃらメソッドを呼べば良かったのです。つまり、set/get以下が同名のメソッド同士をセットで使えば良いのです。
今回の場合は、getAttributeメソッドですね。
戻り値はObjectですがこれはキャストすれば良いのです。
FileInfomation 変数 = (FileInfomation)request.getAttribute("fileinfo1");
てな具合です。

なお、getParameterメソッドは、クライアント(ブラウザ)から送信されたパラメータを取得するメソッドです。

さて、話を次の段階に進めて、配列を受け渡しできるか?となりますが、、できます。
サーブレット側で、
request.setAttribute("キー文字列", fileinfo);
として、JSP側で、
FileInfomation[] 変数 = (FileInfomation[])request.getAttribute("キー文字列");
とすれば、良いのです。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング