下準備
テストドライバの導入
第20回目 (秋学期07回目) 分のテストドライバを導入する。以下の手順で行う。
- ダウンロード のページを開く (ここをクリック)
- プロジェクト「java2007」にある「test」の左側の「+」をクリック
- ツリーが展開されるので「install-libraries.xml」を右クリック
- 「実行(R)」にマウスカーソルを合わせる
- 「1 Ant ビルド」をクリック
- 「コンソール」タブに"BUILD SUCCESSFUL"と表示されれば成功
- eclipseの画面でプロジェクト「java2007」を右クリック
- メニューが表示されるので、「更新」をクリック
- "week20.zip" をデスクトップなどにダウンロード
- eclipseの画面でプロジェクト「java2007」を右クリック
- メニューから「インポート(I)」を選択
- 「インポート」ウィンドウが表示されるので、「Zip ファイル」を選択
- 「次へ(N)」をクリック
- 宛先フォルダー(L): が「java2007」になっていることを確認
- From zip file: の右側にある 「参照(R)...」をクリック
- ファイルダイアログが表示されるので、ダイアログ内に表示されたダウンロードしたファイルをダブルクリック
- 前の画面に戻るので、From zip file: のエリアに正しいパスが入力されていることを確認
- フォルダ「/」の左にチェックがついていることを確認 (ついていなければチェックボックスをクリック)
- 「警告を出さずに既存リソースを上書き」にチェックがついていることを確認 (上書きしたくないファイルがある場合はチェックを外す)
- 「終了 (F)」をクリック
第20週目テストドライバの導入に成功すると、java2007 プロジェクトの test フォルダに j2.lesson07.xml というフォルダが作成される。
パッケージの作成
過去の演習を参考にして、「j2.lesson07」というパッケージを作成する。
文字列を操作するプログラム
文字列を操作するプログラムとして、NameSplitter クラスを作成する。
このプログラムは "Alan Turing" のように、ファーストネームとファミリーネームを半角スペースで区切りで入力すると、ファーストネーム、ファミリーネーム、イニシャルを表示する。
フルネームを入力:Alan Turing first name: Alan family name: Turing initial: A.T.
このプログラムでは文字列を操作するため、文字列に関するクラス「String」についてのAPI 仕様を調べるとよい。
擬似コードの作成
「プログラム全体」の擬似コード
プログラム全体の擬似コードは以下のようにする。
プログラム全体 print "フルネームを入力:" full = コンソール入力 (文字列) if ファーストネームとファミリーネームの間にスペースがない print "不正な入力:" + full, 改行 return first = full のうちのスペースまで family = full のうちのスペース以降 initial = (firstの1文字目) + "." + (familyの1文字目) + "." initial を大文字に変換 print " first name: " + first, 改行 print "family name: " + family, 改行 print " initial: " + initial, 改行
骨格の作成
クラスの作成
以下の手順で、パッケージ「j2.lesson07」に「NameSplitter」クラスを作成する。
- 先ほど作成したパッケージ 「j2.lesson07」の上で右クリック
- マウスカーソルを「新規」に合わせる
- 「クラス」をクリック
- クラス名は NameSplitter とする。
擬似コードの貼り付け (骨格のみ)
作成したクラスに、各擬似コードの名前を貼り付ける。ただし、「プログラム全体」ではコンソールからの入力を行っていたため、import java.io.*; も追加する。
package j2.lesson07; import java.io.*; public class NameSplitter { // プログラム全体 }
パッケージについてしっかり理解できていれば、次の3つのクラスを必要に応じて個別にインポートしてもよい。
- java.io.IOException
- java.io.BufferedReader
- java.io.InputStreamReader
mainメソッドの作成 (骨格のみ)
擬似コード「プログラム全体」に合わせて、クラス「NameSplitter」内にpublic static void main(String[] args) から始まるメソッドを作成する。ただし、擬似コード「プログラム全体」ではコンソールからの入力を行っていたので、throws IOExceptionをつける。
全体の骨格
ここまでのプログラムの骨格は以下のようになる。
package j2.lesson07; import java.io.*; public class NameSplitter { // プログラム全体 public static void main(String[] args) throws IOException { } }
骨格テスト
ここまでの作業をCtrl+Sを押して保存し、コンパイルを行う (保存時に自動で行われる)。ここでエラーが発生していたら文法エラーなので見直す。
「NameSplitterに対する骨格テスト」を実行する。
骨格テストを行った際に緑のバーが表示されれば、外側から見たプログラムの骨格は正しくなっている。
赤いバーが表示された場合、メッセージを元にプログラムを見直すこと。修正を行い、Ctrl+Sで保存した後に「Run」ボタンをクリックする。
メッセージ | 詳細 |
---|---|
(クラス名), existence | j2.lesson07 に対象のクラスが存在していない。パッケージやクラス名を確認 |
(メソッド名), existence | 指定されたメソッドが存在しない |
(メソッド名), public | メソッドを作る際に public が抜けている |
(メソッド名), static | メソッドを作る際に static が抜けている |
(メソッド名), type <T> | メソッドを作る際に戻り値の型を間違えている (正しくは <T>) |
(メソッド名), throws java.io.IOException | メソッドを作る際に throws IOException が抜けている |
プログラムへの変換
先ほど作成した NameSplitter クラスの main メソッドの中身を記述する。
まずは擬似コードをコメントとして貼り付ける。
// プログラム全体 public static void main(String[] args) throws IOException { // print "フルネームを入力:" // full = コンソール入力 (文字列) // if ファーストネームとファミリーネームの間にスペースがない // print "不正な入力:" + full, 改行 // return // first = full のうちのスペースまで // family = full のうちのスペース以降 // initial = (firstの1文字目) + "." + (familyの1文字目) + "." // initial を大文字に変換 // print " first name: " + first, 改行 // print "family name: " + family, 改行 // print " initial: " + initial, 改行 }
コンソール入力
擬似コードの下記の部分は、今までどおり入力を要求する文章を表示し、コンソール入力を行うだけなので問題ない。
print "フルネームを入力:" full = コンソール入力 (文字列)
これまでの知識で擬似コードを簡単に変換できる。
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); // print "フルネームを入力:" System.out.print("フルネームを入力:"); // full = コンソール入力 (文字列) String full = reader.readLine();
スペースを探す処理
擬似コードの次 (下記) の部分では、入力された文字列 (full) 内のスペースを探して、それを用いて処理を行っている。
if ファーストネームとファミリーネームの間にスペースがない print "不正な入力:" + full, 改行 return first = full のうちのスペースまで family = full のうちのスペース以降
スペースを探す処理は、次のように String クラスにある charAt(int) と length() メソッドを使用すれば実現できるが、今回は他の API を用いて処理を記述してみる。下記から使えそうなメソッドを探してみることにする。
通常、「文字列内のスペースを探す」といった用途が限られるメソッドは通常は API として用意されていない。限定的なメソッドを探すのではなく、「文字列内の指定した文字(列)を探す」といった、一般的なメソッドを探すと良い。
そのような機能として、indexOf(char) や indexOf(String) といったメソッドが用意されている。概要を見てみると、次のようなメソッドである。
- int indexOf(String str)
-
この文字列内で、指定された部分文字列が最初に出現する位置のインデックスを返します。
他にもオーバーロードされたメソッドがいくつかあるが、文字コードの話を詳しくしてこなかったため、上記のメソッドを使うことにする。このメソッドの詳細を読むと、次のような記述がある。
- indexOf(String) の 戻り値:
-
文字列引数がこのオブジェクト内の部分文字列である場合は、該当する最初の部分文字列の最初の文字のインデックス。部分文字列がない場合は -1
まとめると、次のようなメソッドであることが分かる。
- 指定した文字列と同じものをこの文字列が含んでいた -> 含んでいた位置を返す
- 指定した文字列と同じものをこの文字列が含んでいない -> -1 を返す
これを用いて、次のように擬似コードをプログラムに変換する。
// if ファーストネームとファミリーネームの間にスペースがない int spacePos = full.indexOf(" "); if (spacePos == -1) { // print "不正な入力:" + full, 改行 System.out.println("不正な入力:" + full); // return return; }
これ以降は、次に説明する。
ちなみに、charAt(int) と length() を併用して indexOf と同じ動作をさせるには、次のように書けばよい。
int spacePos = -1; for (int i = 0; i < full.length(); i++) { char c = full.charAt(i); if (c == ' ') { spacePos = i; break; } } ...
部分文字列を切り出す処理
擬似コードの次 (下記) の部分では、入力された文字列 (full) をスペースの前後で分割して、ファーストネームとファミリーネームとしている。
first = full のうちのスペースまで family = full のうちのスペース以降
このように、「文字列の一部を新しい文字列として取得する」ようなメソッドを探す。
「文字列の一部」を「部分文字列」と読みかえれば、ほとんど同じメソッドが見つかる。
- String substring(int beginIndex, int endIndex)
-
この文字列の部分文字列である新しい文字列を返します。
このメソッドの詳細を見ると、次のような記述がある。
パラメータ: beginIndex - 開始インデックス (この値を含む) endIndex - 終了インデックス (この値を含まない) 戻り値: 指定された部分文字列
つまり、"12345".substring(1, 4) は、"2345" ではなく "234" になるようである。「Alan Turing」という名前に対して、先ほどの indexOf では スペースの位置である 4 が返ってきている。それをふまえて substring メソッドによりファーストネームとファミリーネームを切り出すと、次のようになる。
A l a n T u r i n g 0 1 2 3 4 5 6 7 8 9 10 full.substring(0, 4) -> "Alan" = full.substring(0, spacePos) full.substring(5, 11) -> "Turing" = full.substring(spacePos + 1, full.length())
注意すべき点は、"Turing" を切り出す際にスペースの次の位置から文字の最後までを指定する必要がある点である。
これを用いて、次のように擬似コードをプログラムに変換する。
// first = full のうちのスペースまで String first = full.substring(0, spacePos); // family = full のうちのスペース以降 String family = full.substring(spacePos + 1, full.length());
このプログラムでは、first と family の間にスペースが2つ以上入っていた場合のことを考慮していない。String クラスの trim() などを用いて family のスペースを削ってもよい。
頭文字を抽出する処理
擬似コードの次 (下記) の部分では、ファーストネームとファミリーネームの頭文字を取り出し、それを大文字に変換してイニシャルとしている。
initial = (firstの1文字目) + "." + (familyの1文字目) + "." initial を大文字に変換
「(firstの1文字目)」と「(familyの1文字目)」の部分は、最初の文字 - charAt(0) - を使えば問題なく取り出せるし、文字列の + 演算子によって "." を連結させられることも分かる。
問題となるのが大文字に変換する部分で、これはAPIから探すことになる。
すると、次のようなメソッドが見つかる。
- String toUpperCase()
-
デフォルトロケールの規則を使って、この String 内のすべての文字を大文字に変換します。
ロケールとは地域の情報のことである。地域によっては大文字と小文字がアルファベット以外に存在する可能性があるため、上記のような記述をしているだけで、ここでは気にしなくてよい。
これを用いて、次のように擬似コードをプログラムに変換する。
// initial = (firstの1文字目) + "." + (familyの1文字目) String initial = first.charAt(0) + "." + family.charAt(0) + "."; // initial を大文字に変換 initial = initial.toUpperCase();
その他
残りは今までの知識で擬似コードをプログラムに変換できるはずである。
// print " first name: " + first, 改行 System.out.println(" first name: " + first); // print "family name: " + family, 改行 System.out.println("family name: " + family); // print " initial: " + initial, 改行 System.out.println(" initial: " + initial);
プログラムの実行
プログラムを実行する。
入力に "Alan Turing"と与えてやると、以下のように表示される。
フルネームを入力:Alan Turing first name: Alan family name: Turing initial: A.T.
機能テスト
ここまでの作業をCtrl+Sを押して保存し、コンパイルを行う (保存時に自動で行われる)。ここでエラーが発生していたら文法エラーなので見直す。
「NameSplitterに対する機能テスト」を実行する。
赤いバーが表示された場合、メッセージを元にプログラムを見直すこと。修正を行い、Ctrl+Sで保存した後に「Run」ボタンをクリックする。
メッセージ | 詳細 |
---|---|
期待された結果と異なります | 出力された結果が期待された値と異なる。 |
機能テストの項目
項目名 | テストの内容 |
---|---|
AlanTuring | 入力に Alan Turing を指定してプログラムを実行 |
alanturing | 入力に alan turing を指定してプログラムを実行 |
alanTuring | 入力に alan Turing を指定してプログラムを実行 |
Alanturing | 入力に Alan turing を指定してプログラムを実行 |
ClaudeShannon | 入力に Claude Shannon を指定してプログラムを実行 |
John Backus | 入力に John Backus を指定してプログラムを実行 |
プログラム全体
NameSplitterクラス全体を掲載しておく。
package j2.lesson07; import java.io.*; public class NameSplitter { // プログラム全体 public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); // print "フルネームを入力:" System.out.print("フルネームを入力:"); // full = コンソール入力 (文字列) String full = reader.readLine(); // if ファーストネームとファミリーネームの間にスペースがない int spacePos = full.indexOf(" "); if (spacePos == -1) { // print "不正な入力:" + full, 改行 System.out.println("不正な入力:" + full); // return return; } // first = full のうちのスペースまで String first = full.substring(0, spacePos); // family = full のうちのスペース以降 String family = full.substring(spacePos + 1, full.length()); // initial = (firstの1文字目) + "." + (familyの1文字目) + "." String initial = first.charAt(0) + "." + family.charAt(0) + "."; // initial を大文字に変換 initial = initial.toUpperCase(); // print " first name: " + first, 改行 System.out.println(" first name: " + first); // print "family name: " + family, 改行 System.out.println("family name: " + family); // print " initial: " + initial, 改行 System.out.println(" initial: " + initial); } }
多数の数値を扱うプログラム
多数の数値を扱うプログラムとして、DoubleList クラスを作成する。
このプログラムはいくつかの実数を入力し、その実数を10倍したものを表示する。連続して数値を入力するが、空の文字列が入力されたらそこで入力を終了し、結果を表示する。
数値を入力:3.14 数値を入力:2.178 数値を入力: 31.400000000000002 21.78
このプログラムでは可変長のリストを使用するため、「List」や「ArrayList」についてのAPI 仕様を調べるとよい。
- http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/util/List.html
- http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/util/ArrayList.html
また、実数を List に追加するには、ラッパークラスも扱う必要がある。そちらについても目を通しておくとよい。
擬似コードの作成
「プログラム全体」の擬似コード
プログラム全体の擬似コードは以下のようにする。
プログラム全体 以下を無限に繰り返す print "数値を入力:" input = コンソール入力 (文字列) input が空の文字列なら繰り返しをやめる number = input を数値に変換したもの list に number を追加 for element = list 内の要素を順番に print element * 10, 改行
骨格の作成
クラスの作成
以下の手順で、パッケージ「j2.lesson07」に「DoubleList」クラスを作成する。
- 先ほど作成したパッケージ 「j2.lesson07」の上で右クリック
- マウスカーソルを「新規」に合わせる
- 「クラス」をクリック
- クラス名は DoubleList とする。
擬似コードの貼り付け (骨格のみ)
作成したクラスに、各擬似コードの名前を貼り付ける。ただし、「プログラム全体」ではコンソールからの入力を行っていたため、import java.io.*; も追加する。
また、今回は ArrayList を使用して数値を格納することにする。そのため、import java.util.ArrayList; も追加する (import java.util.*; でもよい)。
package j2.lesson07; import java.io.*; import java.util.ArrayList; public class DoubleList { // プログラム全体 }
mainメソッドの作成 (骨格のみ)
擬似コード「プログラム全体」に合わせて、クラス「DoubleList」内にpublic static void main(String[] args) から始まるメソッドを作成する。ただし、擬似コード「プログラム全体」ではコンソールからの入力を行っていたので、throws IOExceptionをつける。
全体の骨格
ここまでのプログラムの骨格は以下のようになる。
package j2.lesson07; import java.io.*; import java.util.ArrayList; public class DoubleList { // プログラム全体 public static void main(String[] args) throws IOException { } }
骨格テスト
ここまでの作業をCtrl+Sを押して保存し、コンパイルを行う (保存時に自動で行われる)。ここでエラーが発生していたら文法エラーなので見直す。
「DoubleListに対する骨格テスト」を実行する。
骨格テストを行った際に緑のバーが表示されれば、外側から見たプログラムの骨格は正しくなっている。
赤いバーが表示された場合、メッセージを元にプログラムを見直すこと。修正を行い、Ctrl+Sで保存した後に「Run」ボタンをクリックする。
メッセージ | 詳細 |
---|---|
(クラス名), existence | j2.lesson07 に対象のクラスが存在していない。パッケージやクラス名を確認 |
(メソッド名), existence | 指定されたメソッドが存在しない |
(メソッド名), public | メソッドを作る際に public が抜けている |
(メソッド名), static | メソッドを作る際に static が抜けている |
(メソッド名), type <T> | メソッドを作る際に戻り値の型を間違えている (正しくは <T>) |
(メソッド名), throws java.io.IOException | メソッドを作る際に throws IOException が抜けている |
プログラムへの変換
先ほど作成した DoubleList クラスの main メソッドの中身を記述する。
まずは擬似コードをコメントとして貼り付ける。
// プログラム全体 public static void main(String[] args) throws IOException { // 以下を無限に繰り返す // print "数値を入力:" // input = コンソール入力 (文字列) // input が空の文字列なら繰り返しをやめる // number = input を数値に変換したもの // list に number を追加 // for element = list 内の要素を順番に // print element * 10, 改行 }
コンソール入力
繰り返し数値を入力させる部分をプログラムに変換する。
以下を無限に繰り返す print "数値を入力:" input = コンソール入力 (文字列) input が空の文字列なら繰り返しをやめる ...
先にループを抜ける条件をはっきりさせておくと、ループを含むプログラムに間違いが少なくなる。ここでは、ループを抜け出す部分までを記述する。
最初の「以下を無限に繰り返す」は無限ループである while(true) を使うことによって実現できる。そのループを抜ける「input が空の文字列なら繰り返しをやめる」という部分は、入力された文字列と空の文字列が同じであるということを調べればよい。
2つの文字列の中身が等しいかどうか調べるメソッドとして、これまでに equals というものを紹介した。
これを用いて、次のように擬似コードをプログラムに変換する。
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); // 以下を無限に繰り返す while (true) { // print "数値を入力:" System.out.print("数値を入力:"); // input = コンソール入力 (文字列) String input = reader.readLine(); // input が空の文字列なら繰り返しをやめる if (input.equals("")) { break; } // number = input を数値に変換したもの // list に number を追加 }
他にも、文字列が空であるということは文字列の長さが 0 であるということと同じであるので、次のように書くこともできる。
if (input.length() == 0)
上記のほうが実行速度は速いので、「違和感なく書ける書き方」を選べばよい。例では、対応する擬似コードと同じ意味を持たせることを重視したため、equals メソッドを使用した。
リストに数値を格納する
擬似コードの次 (下記) の部分では、入力された文字列を数値に変換し、リストに追加している。
number = input を数値に変換したもの list に number を追加
擬似コードではプログラムを厳密に書かないため、list という変数をこれまでに作成しなかった。この list はループを抜けても使用されるため、まずはこれをループに入る直前で宣言する。
ArrayList list = new ArrayList(); // 以下を無限に繰り返す while (true) { // print "数値を入力:" System.out.print("数値を入力:"); // input = コンソール入力 (文字列) String input = reader.readLine(); // input が空の文字列なら繰り返しをやめる if (input.equals("")) { break; } // number = input を数値に変換したもの // list に number を追加 }
list の型を ArrayList にしたが、java.util.List 型を使ってもよい。その場合には import 文を追加しておくこと。
次に、String 型の input を 数値型の number に変換する。このプログラムでは実数を扱うことにしていたため、double 型の変数を使う必要がある。これまでに文字列から double 型への変換は何度も行ってきたため省略する。
最後に ArrayList 型の list に double 型の値を追加するが、double はプリミティブ型であるため、Object 型の値を扱う ArrayList に直接追加することはできない。そのため、ArrayList の add(Object) メソッドの引数に number を渡す際に、ラッパークラス Double でラップしてやる必要がある。
- http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/util/List.html
- http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/util/ArrayList.html
- http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/lang/Double.html
これらを用いて、擬似コードに変換する。
ArrayList list = new ArrayList(); // 以下を無限に繰り返す while (true) { // print "数値を入力:" System.out.print("数値を入力:"); // input = コンソール入力 (文字列) String input = reader.readLine(); // input が空の文字列なら繰り返しをやめる if (input.equals("")) { break; } // double number = input を数値に変換したもの // # Double.valueOf(input) でも良い double number = Double.parseDouble(input); // list に number を追加 // # double 型はプリミティブ型なので、ラッパークラスで包む list.add(new Double(number)); }
追加したコメントにもあるように、「Double.valueOf(String)」というメソッドを使うと double 型ではなく Double 型に直接変換することができる。下記のほうが直感的で分かりやすいならば、そちらを使ってもよい。
list.add(Double.valueOf(input));
リストの走査とラップの解除
擬似コードの次 (下記) の部分では、リストに格納された数値をそれぞれ10倍して表示している。
for element = list 内の要素を順番に print element * 10, 改行
リストの中身を順番に取得するには、
for (int i = 0; i < list.size(); i++) { Object element = list.get(i); }
のように、size() メソッドと get(int) メソッドを併用して実現できる。
- http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/util/List.html
- http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/util/ArrayList.html
上の例では Object 型であるが、ここで扱いたい型は Double 型である。そのため、型キャスト演算子によって Double 型に変換してやる必要がある。
Double element = list.get(i);
また、Double 型の値はそのままでは加減乗除などの演算を行うことはできない。そのため、Double 型からプリミティブ型の double へ doubleValue() というメソッドを使って変換してやる。
これらを用いて、擬似コードに変換する。
// for element = list 内の要素を順番に for (int i = 0; i < list.size(); i++) { // # Object -> Double にキャスト Double element = (Double) list.get(i); // print element * 10, 改行 // # Double 型を double 型に変換 System.out.println(element.doubleValue() * 10); }
リストの走査は、上記のように書くと list.size() を何回も呼び出すため少し時間がかかってしまう。そこで、次のように書くこともできる。
for (int i = 0, n = list.size(); i < n; i++)
少し分かりにくいかも知れないが、これは
int i, n;
という複数の変数を同時に宣言する書き方と
int i = 0; int n = list.size();
という変数の初期化を行う書き方を組み合わせて「int i = 0, n = list.size()」と書いたものである。この書き方ならば list.size() は始めの一度だけしか呼び出されない。
プログラムの実行
プログラムを実行する。
入力に "3.14", "2.178", "" と与えてやると、以下のように表示される。
数値を入力:3.14 数値を入力:2.178 数値を入力: 31.400000000000002 21.78
3.14 は精度の問題で少々値が変わっているが、それ以外はちゃんと 10 倍した値が表示されていることが確認できる。
機能テスト
ここまでの作業をCtrl+Sを押して保存し、コンパイルを行う (保存時に自動で行われる)。ここでエラーが発生していたら文法エラーなので見直す。
「DoubleListに対する機能テスト」を実行する。
赤いバーが表示された場合、メッセージを元にプログラムを見直すこと。修正を行い、Ctrl+Sで保存した後に「Run」ボタンをクリックする。
メッセージ | 詳細 |
---|---|
期待された結果と異なります | 出力された結果が期待された値と異なる。 |
機能テストの項目
項目名 | テストの内容 |
---|---|
sample | 例と同じ内容を入力 |
プログラム全体
DoubleList クラス全体を掲載しておく。
package j2.lesson07; import java.io.*; import java.util.ArrayList; public class DoubleList { // プログラム全体 public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); ArrayList list = new ArrayList(); // 以下を無限に繰り返す while (true) { // print "数値を入力:" System.out.print("数値を入力:"); // input = コンソール入力 (文字列) String input = reader.readLine(); // input が空の文字列なら繰り返しをやめる if (input.equals("")) { break; } // double number = input を数値に変換したもの // # Double.valueOf(input) でも良い double number = Double.parseDouble(input); // list に number を追加 // # double 型はプリミティブ型なので、ラッパークラスで包む list.add(new Double(number)); } // for element = list 内の要素を順番に for (int i = 0; i < list.size(); i++) { // # Object -> Double にキャスト Double element = (Double) list.get(i); // print element * 10, 改行 // # Double 型を double 型に変換 System.out.println(element.doubleValue() * 10); } } }