• 検索結果がありません。

Java プログラミング講習会 第 2 回 芝浦工業大学工学部情報工学科杉本徹 2017 年 3 月 27 日 public class Person { String familyname; String firstname; int age; } public void print() { Sy

N/A
N/A
Protected

Academic year: 2021

シェア "Java プログラミング講習会 第 2 回 芝浦工業大学工学部情報工学科杉本徹 2017 年 3 月 27 日 public class Person { String familyname; String firstname; int age; } public void print() { Sy"

Copied!
6
0
0

読み込み中.... (全文を見る)

全文

(1)

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 どれでもよい

(2)

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

(3)

リストの使い方(例)

• 宣言,初期化:

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

} }

(4)

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 を含む行のみを

出力するように変えてみよう

(5)

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) クラスを拡張して今回の フレームをクラス定義する 関連するクラス群を 参照するように指定

(6)

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 を押す」というイベントが 発生した時の処理方法の定義

プログラムの説明

• JFrame クラスのサブクラスとして作る

• プログラムの先頭に必要な import文を記述

• GUI 部品の変数をクラスの先頭で宣言しておく

• コンストラクタ(初期化用メソッド)で,

– 部品の生成 → 部品の配置 → イベント処理の定義

• main メソッドで,上記コンストラクタを呼び出し

た後,setVisible を呼び出す

演習5: 文書検索の GUI

• 次のようなインタフェースにより文書検索を実

行するプログラムを作る

– 演習3で作った文書検索プログラムを利用(ただし

ファイル出力部は使わない)

• 発展的な課題

– 出力結果に行番号を含めるかどうかを指定できる

ような Checkbox をパネルに追加する

ファイル名 検索 検索語

付録: Java API リファレンスの見方

• ライブラリに含まれる全クラスの

– 機能の説明 – 変数,コンストラクタ,メソッドの説明 が書かれた膨大な量の情報源

• 場所

– ネット上

http://docs.oracle.com/javase/jp/8/docs/api/

参照

関連したドキュメント

周 方雨 東北師範大学 日本語学科 4

エドワーズ コナー 英語常勤講師(I.E.F.L.) 工学部 秋学期 英語コミュニケーションIB19 エドワーズ コナー

学部混合クラスで基礎的な英語運用能力を養成 対象:神・ 社 会・ 法・ 経 済・ 商・ 理 工・ 理・

本研究科は、本学の基本理念のもとに高度な言語コミュニケーション能力を備え、建学

本研究科は、本学の基本理念のもとに高度な言語コミュニケーション能力を備え、建学

本研究科は、本学の基本理念のもとに高度な言語コミュニケーション能力を備え、建学