導入
前回からオブジェクト指向の学習に入り、
展開
配列の扱いを便利にするArrayListクラス
この連載中で紹介した便利なクラスの代表はArrayListです。ArrayListは配列を便利に取り扱えるような工夫が詰め込まれたクラスです。ArrayListを使う最も大きなメリットは、
コード例を示します。もし、
ArrayAndArrayList.pde
println("配列の宣言 ");
int a[] = {1,2,3,4,5};
println("aの要素の値を出力");
for ( int n : a ){
println(n);
}
println("aの要素数は" + a.length);
println("aよりも1つ大きい配列bを宣言");
int b[] = new int[a.length+1];
println("bにaの要素を代入");
for ( int i = 0; i<a.length; i++){
b[i]=a[i];
}
println("新しい要素に値を代入");
b[a.length]=6;
println("aを宣言しなおす");
a = new int[a.length+1];
println("bの要素の値をaに代入する");
for ( int i = 0; i<a.length; i++){
a[i]=b[i];
}
println("aの要素の値を出力");
for ( int n : a ){
println(n);
}
println("//----------");
println("ArrayListを使ってみよう");
println("必要なパッケージを用意");
import java.util.Arrays;
println("ArrayListを宣言");
ArrayList<String> A = new ArrayList(Arrays.asList("Tim Bray",
"Brian Kernighan",
"Jon Bentley",
"Karl Fogel"));
println("現在のArrayListの各要素");
println(A.toString());
println("要素を追加・削除します");
A.add(1,"Eliotte Rusty Harold"); // 2番目位置に要素を挿入します。
A.remove(2); // 3番目の要素を削除します。
println("変更後のArrayListの要素");
println(A.toString());
clone
メソッドやarraycopy
メソッド、System.
メソッドがありますが、
これに対してサンプルsketchのようにfor文で地道に代入する方法をディープ・
この違いは多次元配列のコピーで顕在化します。1次元配列のコピーではclone
もarraycopy
もディープコピーされることを筆者は確かめています。
clone
やarraycopy
でコピーしてください。そして、
ファイル入出力を楽にするPrintWriterクラスとBufferedReaderクラス
Processingでテキストデータをまとめて読み書きする分にはloadStrings
やsaveStrings
といったメソッドを使うのが一番です。
UsageOf_saveStringsAnd_loadStrings.pde
String hisWords
= "Bad programmers worry about the code. "
+ "Good programmers worry about data structures "
+ "and their relationships.(Linus Torvalds)";
String[] list = split(hisWords, ' ');
saveStrings("LinusSaids.txt", list);
String words[] = loadStrings("LinusSaids.txt");
println("He said");
for (String val: words) {
print(val + " ");
}
println();
しかし、PrintWriter
クラスやBufferedReader
クラスのインスタンスを用います。
ProcessingのAPIリファレンスを参照してください。
これらの便利なクラスを用いれば、
サンプルコードを読むと分かるように、
演習
演習1(難易度:easy)
ArrayList
インスタンスのコピーにおいて、
演習2(難易度:easy)
PrintWriterとBufferedReaderそれぞれのリファレンスに掲載されているサンプルコードを連結しましょう。ディスプレイウインドウ上を動くマウスポインタの軌跡を黒い点として描画し、SaveAndLoad.
としてください。
まとめ
- インスタンスを作成して使うクラスの便利さを紹介しました。
学習の確認
それぞれの項目で、
ArrayList
クラスを使うと楽になる意味が理解できましたか?- 理解できた。気持ちよく納得した。
- 理解できた。しかし、
今ひとつスッキリしない。 - 理解できない。
ファイル操作用のクラスの便利さが理解できましたか?
- 理解できた。気持ちよく納得した。
- 理解できた。しかし、
今ひとつスッキリしない。 - 理解できない。
参考文献
- 『本格学習Java入門[改訂新版]』
(佐々木整 著、 技術評論社) - Java言語の基本的な文法が良くまとめられています。また、
大変広い範囲をカバーしているので、 はじめてJava言語に触る方が、 Javaがどんな言語なのかを知るために役立つ資料になるでしょう。
- Java言語の基本的な文法が良くまとめられています。また、
演習解答
違いが起こる。
次のsketchを実行すると分かります。値を格納しているインスタンスは
names
です。インスタンスprogrammers
はnames
への参照を持っているだけで、programmers
だけのための記憶領域は確保していません。11行目でインスタンスnames
のアドレスを受け取っていると考えてください。このようなコピーでは、names
の要素への変更はprogrammers
の要素に影響し、逆もまた然りです。値を記憶している領域を共有しているのですから当然です。 ぞれぞれ独立した記憶領域を持つ
ArrayList
インスタンスにしたければ、次のように操作する必要があります。新しく宣言した ArrayList
インスタンスへコピー元のインスタンスの要素値を追加するのです。こうすることでnames
とprogrammers
でそれぞれ別の記憶領域に値を記憶させておくことができます。一方に加えた変更は他方へ影響を与えません。