Javaプログラミング講習会
第2回
芝浦工業大学 工学部 情報工学科
杉本 徹
2017年3月27日
public class Person {
String familyName; String firstName; int age; public void print() {
System.out.println(familyName + firstName + "さんは" + age + "才です"); }
}
public class Test3 {
public static void main(String[] args) { Person x = new Person(); System.out.println(x.age); x.print(); Person y; System.out.println(y.age); y.print(); } } 前回の復習クイズ: 実行結果はどうなりますか?
復習: Java言語の構成(イメージ図)
①基本部分(データ型,制御構造) ②オブジェクト指向プログラミング ③ライブラリ群(API) Java 学習の手順: ①基本部分のマスター(≒C言語) ②オブジェクト指向の考え方に慣れる ③ライブラリを使いこなせるようになる Application Programming Interface今日の内容
1.ライブラリの使い方(Stringクラス)
2.ライブラリの使い方(リスト処理)
3.ライブラリの使い方(ファイル入出力)
4.ライブラリの使い方(Swing GUI)
1.ライブラリの使い方
(String クラス)
String クラス
• 文字列を1個の「もの」(オブジェクト)として扱うためのクラス – インスタンスの例: “ abc ” ,“日本語”,“3”, “ ”(長さ 0 の文字列) – 注意: null(文字列の不存在)と “ ”(長さ 0 の文字列) は異なる! • メソッドの紹介 – equals メソッド(等値性の判定) • 使用例: s1.equals(s2) 2つの文字列 s1,s2 が同じ内容ならば true – length メソッド(文字列の長さ(文字数)を返す) • 使用例: s.length() – 例: 文字列 s が “ ” と等しいかどうかの判定法 • s.equals(“ ”) • “ ”.equals(s) • s.length() == 0 どれでもよいString クラス(続き)
• indexOf
メソッド(使用例 s1.indexOf(s2))
– その文字列中から他の文字列を検索して,もし存在すれ ばその先頭インデックスを,存在しなければ -1 を返す• startsWith
メソッド(使用例 s1.startsWith(s2))
– その文字列が特定の文字列で始まるかどうかの判定• substring
メソッド(使用例 s1.substring(2, 4))
– 文字数位置で指定された部分文字列を求めて返す• split メソッド
(使用例 s1.split(“¥t”))
– 指定した区切り記号によって文字列を分解し,その結果 を配列に格納して返す演習1: String クラスのメソッドに慣れる
public class Test5 {public static void main(String[] args) { String s1 = "芝浦工業大学"; String s2 = "芝浦"; System.out.println(s1.length()); System.out.println(s2.length()); System.out.println(s1.indexOf("工業")); System.out.println(s2.indexOf("工業")); System.out.println(s1.startsWith(s2)); System.out.println(s1.substring(2, 4)); System.out.println(s1.substring(2)); System.out.println(s1.substring(0, 2).equals(s2)); System.out.println(s1.substring(0, 2) == s2); String[] split = “This is a pen".split(" "); for (int i = 0; i < split.length; i++) { System.out.println(split[i]); }
} }
演習1a: String クラスのメソッドの応用
public class Test5a {
public static void main(String[] args) { String s1 = "芝浦工業大学"; String s2 = “英語ではSIT"; s1 = reverse(s1); s2 = reverse(s2); System.out.println(s1); // “業大学芝浦工” と出力される System.out.println(s2); // “はSIT英語で” と出力される }
public static String reverse(String s) { // ここにプログラムを書く } } • 以下のプログラムにおける reverseメソッドを完成しなさい。
2.ライブラリの使い方
(リスト処理)
リスト(List)とは?
• (同じ型の)オブジェクトを並べたもの
• 配列と似ているが,後から要素を自由に追加
したり削除したりできる点が異なる ⇒ 便利!
“A” “B” “C” “D” “A” “C” “A” “B” “C” 例: 文字列のリスト List<String> 要素を追加する add(“D”) 要素を削除する remove(“B”)リストと配列の比較
※ 注: 基本型(intなど)の値を要素として代入することは可能 例: List<Integer> l = new ArrayList<Integer>(); l.add(123);リスト 配列 要素の型 最初に指定(オブジェクト型のみ) ※注 最初に指定(基本型,オブジェクト型) 要素の個数 後から自由に要素の追加・削除が可能 固定(配列オブジェクト初期化時に指定) 使用の準備 import java.util.* ―
型名 例: List<String> 例: String[]
初期化 new ArrayList<String>() new String[10]
要素の参照 例: l.get(3) 例: a[3]
要素数を求める 例: l.size() 例: a.length
リストの使い方(例)
• 宣言,初期化:
List<String> l = new ArrayList<String>();• 要素の追加:
l.add(“A”); l.add(挿入位置, “A”)
• 要素の削除:
l.remove(“B”); l.remove(削除位置);
• 値の参照:
l.get(参照したい位置);
• リストの全要素にわたる繰り返し処理
– 方法1(配列風):for (int i = 0; i < l.size(); i++) { ・・・ l.get(i) ・・・ }
– 方法2(Java 5 で導入された拡張for文を使用) for (String s : l) { ・・・ s ・・・ } – 他にも Iterator を用いる方法がある
その他の便利なメソッド
• java.util.List に用意されたメソッド
– ある値がリストに含まれるか検査
l.contains(値)
– ある値の出現位置を求める
l.indexOf(値)
• java.util.Collections に用意されたメソッド
– 要素のソート
Collections.sort(リスト)
– 他に,要素の置換,並べ替え,最大値抽出,出現
回数カウントなどのメソッドが用意されている
演習2: List の使い方に慣れる
• 課題1: リスト l から “is” を削除し,”pencil” を追加(remove, add メソッド) • 課題2: リスト l に “pen” という要素が含まれているか検査(containsメソッド) • 課題3: リスト l をアルファベット順にソート(Collections.sort メソッド)
import java.util.*; public class Test6 {
public static void main(String[] args) {
List<String> l = new ArrayList<String>(); l.add("This");
l.add("is"); l.add("a"); l.add("pen");
for (int i = 0; i < l.size(); i++) {
System.out.println(l.get(i)); } for (String s : l) { System.out.println(s); } } }
参考: 歴史的なメモ
• Vector クラス
– 古くからある.最近はあまり使われない
• Collection ライブラリ(List, Set, Map など)
– Java 1.2 から導入された強力なライブラリ
• Java 5 からの新機能
– List の要素の型を指定できるようになった
• 以前は単に「List」 ⇒ Java 5 からは「List<String>」– 拡張 for文
– auto boxing/unboxing (基本型も使いやすく)
参考: マップ(Map)の利用
• Map<型1, 型2>
型1のオブジェクトと型2の
オブジェクトの対応関係(写像)を表す
• 例:
メソッド put(key, value) 指定したキー key に, 指定した値 value を 対応づける メソッド get(key) 指定してキー key に対 応づけられた値を返す 国名(String) 都市名(String) “日本” “韓国” “中国” … “東京” “ソウル” “北京” …参考: Mapを使ったプログラム例
import java.util.*;public class Test {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>(); map.put("日本", "東京");
map.put("韓国", "ソウル"); map.put("中国", "北京");
System.out.println("日本の首都は" + map.get("日本"));
for (String str : map.keySet()) {
System.out.println(str + "の首都は" + map.get(str)); }
} }
3.ライブラリの使い方
(ファイル入出力)
ファイル入出力: C言語との比較
C言語
Java
ファイルを表す データ構造 FILE構造体 File クラス, InputStream, Reader OutputStream, Writer ファイルを開く fopen関数 new演算子 データの 読み書き fprintf, fscanfなど Reader,Writer クラスのメソッド ファイルを閉じる fclose関数 closeメソッドJava におけるファイル入出力法
• 一般に,入出力は「ストリーム」という概念によって統一的に 扱われる • 入出力のための一般的な手順 1. 入力元(出力先)を表すオブジェクトの作成 2. データの通信路となる InputStream(OutputStream)オブジェクトの作成 3. 入出力に便利なメソッドを備えた Reader(Writer)オブジェクトの作成 4. 付加的な機能を実現する BufferedReader,PrintWriter などの作成 5. 入出力メソッドの実行 プログラム 標準入力 ファイル プロセス ソケット インターネット 標準出力 ファイル プロセス ソケット 入力ストリーム 出力ストリームファイル入出力の手順
• 入力手順
1. 入力ファイル名を指定し,FileInputStream を作成 2. InputStreamReader を作成 3. BufferedReader を作成 4. 入力の実行(readLineメソッドなど)• 出力手順
1. 出力ファイル名を指定し,FileOutputStream を作成 2. OutputStreamWriter を作成 3. BufferedWriter を作成 4. (PrintWriter を作成) 5. 出力の実行(writeメソッド, printlnメソッドなど) FileReaderクラスで代用可能 FileWriterクラスで代用可能参考: その他の入出力の例
• プロセス間通信(例:入力の場合)
– Process オブジェクト → InputStream の作成 →
InputStreamReader の作成 → BufferedReader
の作成 → データ入力の実行
• ネットワーク通信(例:URLを指定しての受信)
– URL オブジェクト → InputStream の作成 →
InputStreamReader の作成 → BufferedReader
の作成 → データ入力の実行
演習3:文書検索
• 指定されたテキストファイルからデータを読み込み,
特定の文字列を含む行のみを別のファイルに出力
するプログラムを作る
• ファイルを置く場所: プロジェクトフォルダの中
• まず次のページのプログラムを打ち込んでみよう
• 説明: try ~ catch 例外処理
– ファイル処理など不測の事態が起こる可能性がある処理 を行う時は,try ~ catch 節を用いて例外時の処理方法 を定義しておく必要がある• プログラムを改良し,searchWord を含む行のみを
出力するように変えてみよう
import java.io.*; public class Test7 {
public static void main(String[] args) { String inputFileName = "bocchan.txt"; String outputFileName = "output.txt"; String searchWord = "授業"; try {
BufferedReader br = new BufferedReader(
new FileReader(inputFileName)); PrintWriter pw = new PrintWriter(new BufferedWriter( new FileWriter(outputFileName))); String line;
while ((line = br.readLine()) != null) { pw.println(line);
} br.close(); pw.close();
} catch (IOException ex) { ex.printStackTrace(); } } }
補足説明
• 前ページのプログラムで,ファイルから入力した文字列
が文字化けする場合は,次のように変更する.
– 変更前: new FileReader(ファイル名)– 変更後: new InputStreamReader(new FileInputStream( ファイル名), "JISAutoDetect")
• ファイルへの出力の際,出力する文字コードの種類を
指定したい場合は,次のように変更する.
– 変更前: new FileWriter(ファイル名) – 変更後: new OutputStreamWriter(new FileOutputStream(ファイル名), 文字コード種類)文字コード種類:"Shift_JIS", "EUC_JP", "UTF-8" など
4.ライブラリの使い方
(Swing GUI)
Javaにおける GUI プログラミング
• GUI 部品
– ボタン,テキストフィールド,メニューなど• イベントドリブンプログラミング
– ユーザのマウス操作やキーボード入力(イベント)を待ち受 けて,イベントが発生した時にそのイベントの種類に応じて 定義しておいた処理(メソッド)が起動されるようにする• Swing ライブラリ
– 使い勝手のよい GUI ライブラリ群 • 他に awt というより基本的なライブラリ群もある• Eclipse の VisualEditor
– GUI のデザインを視覚的に確認しながら行えるツールSwing GUI部品の例
• JFrame
• JButton
• JLabel
• JTextField, JTextArea
• JCheckBox, JRadioBox
• JTable, JTree
• JPanel, JScrollPane
• JMenuBar, JToolBar など
演習4: Swing GUI を使ったサンプル
import javax.swing.*; import java.awt.*; import java.awt.event.*;public class Frame1 extends JFrame { JLabel label1, label2;
JTextField inputField1, inputField2; JButton button1;
JTextArea outputArea; public Frame1() {
setTitle("フレームのテスト"); setBounds(300, 100, 400, 400); label1 = new JLabel("苗字", JLabel.RIGHT); label2 = new JLabel("名前", JLabel.RIGHT); inputField1 = new JTextField();
inputField2 = new JTextField(); button1 = new JButton("表示"); outputArea = new JTextArea();
コンストラクタ (初期化メソッド) 部品の 変数宣言 部品の生成 既存のフレーム(JFrame) クラスを拡張して今回の フレームをクラス定義する 関連するクラス群を 参照するように指定
JPanel panel1 = new JPanel(); panel1.setLayout(new GridLayout(2, 1)); panel1.add(label1);
panel1.add(label2); JPanel panel2 = new JPanel(); panel2.setLayout(new GridLayout(2, 1)); panel2.add(inputField1);
panel2.add(inputField2); JPanel panel3 = new JPanel(); panel3.setLayout(new GridLayout(1, 3)); panel3.add(panel1);
panel3.add(panel2); panel3.add(button1);
JScrollPane scrollPane = new JScrollPane(outputArea); Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout()); contentPane.add("North", panel3); contentPane.add("Center", scrollPane); パネル(複 数の部品 を入れられ る入れ物) を使って, レイアウト を組み立て ていく フレーム 自身の内 容を設定 setDefaultCloseOperation(EXIT_ON_CLOSE); button1.addActionListener ( new ActionListener() {
public void actionPerformed(ActionEvent e) {
outputArea.append("苗字は" + inputField1.getText() + "¥n"); outputArea.append("名前は" + inputField2.getText() + "¥n"); }
} ); }
public static void main(String[] args) {
Frame1 f = new Frame1(); // フレームの新規作成(初期化) f.setVisible(true); // 画面上に見えるようにする } } ウィンドウが閉じられた 時にプログラムも終了 するようにする 「button1 を押す」というイベントが 発生した時の処理方法の定義