このページは、学部2年生向け授業である、「マルチメディアプログラミング実習」 のために用意しました。
(Wikiの仕様で大文字小文字が混在した英単語に疑問符?が追加されるところがありますが、無視してください。)
C言語では、エラーが出そうな処理をする場合は、エラーが発生するかどうかをステップごとにif文でチェックして、対処していました。プログラムが読みにくく煩雑になりがちです。
現代的な言語では、プログラムの処理をブロックでまとめて、その部分から発生したエラーを別の部分で受け取って処理をする書き方ができます。
Javaの多くのメソッドが標準的なエラー処理をサポートしています。また、自分でエラー処理を設計することも可能です。ただ、この授業の範囲では、自分でエラー処理を設計することはないと思います。標準的な機能の利用を練習しておきます。
次のプログラムを作って試してください。 引数が2個あることを前提としています。 なので、引数が少ないとエラーが出ます。確認してください。
public class TestException { public static void main(String argv[]){ System.out.println(argv[0]+" "+argv[1]); System.out.println("Nice to meet you."); } }
エラーが出る可能性のある場所をtryでくくっておき、 エラーが出たらそれを捕捉する処置をcatchで指定します。
public class TestException { public static void main(String argv[]){ try{ System.out.println(argv[0]+" "+argv[1]); System.out.println("Nice to meet you."); } catch (Exception e) { System.out.println("please input 2 words."); } } }
以下のリンクからStringクラスを選択して、何ができるかざっと見ておきましょう。
https://docs.oracle.com/javase/jp/8/docs/api/index.html
public class TestString { public static void main (String argue[]) { String str = "Hello Java World"; //このstrを表示してください(System out.printlnを使う) //strの長さを表示してください(.lengthを使う)) //strの3要素目の文字を表示してください //最初にaが現れる位置を表示してください //最後の文字aが現れる位置を表示してください //辞書式で比較してstrと次のstr2をcompareToを使って比較してください。順番を変えるとcompareToが返す値はどうなるでしょう? String str2="Have World"; //strの6要素目から始まる部分文字列を作り表示して表示してください。 //int型をString型に変換してください。 int v2020=2020; String s2020 = String.valueOf(v2020); } }
解答例:
public class TestString{ public static void main(String args[]){ String str = "Hello Java World"; System.out.println(str); System.out.println(str.length()); System.out.println(str.charAt(3)); System.out.println(str.indexOf('a')); String str2 = "Hello World"; System.out.println(str.compareTo(str2)); System.out.println(str2.compareTo(str)); System.out.println(str.substring(6)); int v2020=2020; String s2020 = String.valueOf(v2020); System.out.println(s2020); } }
最初の引数(文字列)を表示するプログラムは、以下です。クラス名はTestStringにしました。
public class TestString { public static void main(String argv[]) { System.out.println(argv[0]); } }
これを元に、最初の引数(文字列)を逆に出力するプログラムを作ってください。例えば、ochanomizuと入力すると、以下のように表示されるプログラムを作ります。
[e100:?/Documents/java] siio% java TestString ochanomizu ochanomizu uzimonahco [e100:?/Documents/java] siio%
さらには、引数がない場合は引数入力を促すことを表示してみよう。
[e100:?/Documents/java] siio% java TestString please input a word [e100:?/Documents/java] siio%
解答例:
public class TestString { public static void main (String argv[]) { try{ System.out.println(argv[0]); int len = argv[0].length(); for(int i = len - 1; i>=0; i--) { System.out.print(argv[0].charAt(i)); } System.out.println(); } catch (Exception e) { System.out.println("please input a word"); } } }
https://docs.oracle.com/javase/jp/8/docs/api/index.html
要素があって、次の要素へのポインターを持っているような、リスト構造です。
(element 1) ---> (element 2) ---> (element 3) ---> ... ---> (element n)
次のプログラムを作ってLinked Listのメソッドを使ってみましょう。 定義とコンストラクタで<String>と書くのは、要素がStringのインスタンスだという宣言です。 昔のJavaでは不要だったのですが、今のバージョンではこのような形式で明示的に書かないといけないようです。
import java.util.*; public class LinkedListTest{ public static void main(String[] args) { LinkedList<String> list = new LinkedList<String>(); String name1="ALICE"; String name2="BOB"; //listにname1をaddしてください //listにname2をaddしてください //listの要素数を取得して表示してください //listから最初の要素をgetFirstで取り出して表示してください //listからget(1)してその結果を表示してください String name3="CINDY"; String name4="DAVE"; //listにname3をaddしてください。 //listからname1を削除してください(remove) //listにname4をaddFirstしてください。 //この結果、"DAVE" --> "BOB" --> "CINDY"となると思います。 //listの全要素にアクセスするには、Iteratorインスタンスを作ると便利です。 //以下のようにして全要素を表示してください。 Iterator it = list.iterator(); while(it.hasNext()) { String st = (String)it.next(); System.out.println(st); } //toArrayメソッドで配列を作ることもできます //以下のようにして全要素を表示してください。 Object[] names = list.toArray(); for(Object s: names) System.out.println(s); } }
解答例:
Import java.util.*; public class LinkedListTest{ public static void main(String args[]){ LinkedList<String> list = new LinkedList<String>(); String name1 = "ALICE"; String name2 = "BOB"; list.add(name1); list.add(name2); System.out.println(list.size()); System.out.println(list.getFirst()); System.out.println(list.get(1)); String name3 = "CINDY"; String name4 = "DAVE"; list.add(name3); list.remove(name1); list.addFirst(name4); Iterator it = list.iterator(); while(it.hasNext()) System.out.println(it.next()); Object[] names = list.toArray(); for(Object s: names) System.out.println(s); } }
解答例(丁寧版):
import java.util.*; public class LinkedListTest{ public static void main(String[] args) { LinkedList<String> list = new LinkedList<String>(); String name1="ALICE"; String name2="BOB"; list.add(name1); list.add(name2); String firstname=list.getFirst(); String secondname=list.get(1); System.out.println("listの要素数は" + list.size()); System.out.println("listの最初の要素は" + firstname + "2番目の要素は" + secondname); String name3="CINDY"; String name4="DAVE"; list.add(name3); list.remove(name1); list.addFirst(name4); Iterator it = list.iterator(); System.out.println("要素の走査"); while(it.hasNext()){ String st = (String)it.next(); System.out.println(st); } System.out.println("要素の走査 by toArray()"); Object[] names = list.toArray(); for(Object s: names) System.out.println(s); } }
https://docs.oracle.com/javase/jp/8/docs/api/index.html
Linked Listと同様にインスタンスの集まりを保持するデータ構造です。
(element 1) ---> (element 2) ---> (element 3) ---> ... (element n)
だだし、同一要素を重複して保持しません。
import java.util.*; public class HashSetTest{ public static void main(String args[]){ HashSet<String> set = new HashSet<String>(); String name1="Alice"; String name2="Bob"; String name3="Cindy"; //setにname1をaddしてください //setにname2をaddしてください //setにname3をaddしてください //setに再びname1をaddしてみてください。その時の戻り値 (booleanです)の状態を表示してください。 //setの内容をIteratorを使って全部表示してください。 } }
解答例:
import java.util.*; public class HashSetTest{ public static void main(String args[]){ HashSet<String> set = new HashSet<String>(); String name1="Alice"; String name2="Bob"; String name3="Cindy"; //name1,2,3を追加 set.add(name1); set.add(name2); set.add(name3); //name1の再度追加を試みる。失敗 System.out.println(set.add(name1)); Iterator it = set.iterator(); while(it.hasNext()) System.out.println(it.next()); } }
https://docs.oracle.com/javase/jp/8/docs/api/index.html
2つのインスタンスのマッッピング(対応付け)の集まりを保持するクラスです。2つのインスタンスをキー(key)と値(value)と言います。例えば、keyもvalueもどちらもStringインスタンスの場合、以下のようにして要素を追加していきます。
import java.util.*; public class EtoJ{ public static void main(String args[]) { HashMap<String,String> map = new HashMap<String,String>(); map.put("apple","りんご"); map.put("banana","バナナ"); ... } }
このプログラムで、mapインスタンスからkeyに対応するvalueを取り出すためには、
map.get("apple");
などとします。
このプログラムを拡張して、以下のように動作する英語ー日本語単語変換プログラムを作ってください。
[e100:?/Documents/java] siio% java EtoJ banana バナナ [e100:?/Documents/java] siio% java EtoJ apple りんご [e100:?/Documents/java] siio% java EtoJ Please input an English word
解答例:
import java.util.*; public class EtoJ{ public static void main(String args[]) { HashMap<String,String> map = new HashMap<String,String>(); map.put("apple","りんご"); map.put("banana","バナナ"); map.put("orange","みかん"); map.put("pineapple","パイナップル"); map.put("grape","ぶどう"); map.put("peach","もも"); map.put("melon","メロン"); map.put("lemon","レモン"); try { System.out.println(map.get(args[0])); } catch(Exception e) { System.out.println("Please input an English word"); } } }