Aritalab:Lecture/Programming/Java

From Metabolomics.JP
< Aritalab:Lecture | Programming(Difference between revisions)
Jump to: navigation, search
m
m
Line 9: Line 9:
 
ファイル名はそのファイル内に記述するクラス名にします。
 
ファイル名はそのファイル内に記述するクラス名にします。
 
ファイル集合の中で、どこかに一箇所、スタートする位置としてmain関数をおきます。
 
ファイル集合の中で、どこかに一箇所、スタートする位置としてmain関数をおきます。
;ファイル Test.java
+
;Hello World!と書く Test.java
 
<pre>
 
<pre>
 
public class Test {
 
public class Test {
Line 24: Line 24:
 
[1]+  Done
 
[1]+  Done
  
$ java Test This is a pen
+
$ java Test Hello World
This
+
Hello
is
+
World
a
+
pen
+
 
</pre>
 
</pre>
  
Line 35: Line 33:
 
また、各基本データ型<tt>int, float, double</tt>等はクラスと互換性が無いため、それぞれ<tt>Integer, Float, Double</tt>というクラスが用意されています。<br/>
 
また、各基本データ型<tt>int, float, double</tt>等はクラスと互換性が無いため、それぞれ<tt>Integer, Float, Double</tt>というクラスが用意されています。<br/>
  
Javaで小数とfloatを一緒に使うと、「精度が落ちている」とエラーになります。メモリ量は気にしないで常にdoubleを使いましょう。
+
{| class="wikitable" style="width:20%; float:right"
 +
! 浮動小数点の精度
 +
|-
 +
| Javaで小数とfloatを一緒に使うと、「精度が落ちている」とエラーになります。メモリは気にせず常にdoubleを使いましょう。
 +
|}
 
<pre>
 
<pre>
  float  f = 3.14;  // コンパイルエラー。精度が落ちている。3.14fはOK。
+
  float  f = 3.14;  // コンパイルエラー。精度が落ちている。3.14fならOK
  double d = 3.14;  // OK。
+
  double d = 3.14;  // OK
 
</pre>
 
</pre>
  
Line 53: Line 55:
 
int pi = Integer.valueOf(str); // コンパイルエラー。3.1415は整数ではない。
 
int pi = Integer.valueOf(str); // コンパイルエラー。3.1415は整数ではない。
 
</pre>
 
</pre>
数値を逆に文字列にするには+記号でOKです。
+
逆に、数値を文字列にするには+記号で大丈夫です。この演算子はオブジェクトに定義される<tt>toString()</tt>というメソッドを呼び出して文字列をつなぎます。
 
<pre>
 
<pre>
String str = "Value of pi is " + 3.1415;
+
String str = "Value of pi is " + 3.14;
 
</pre>
 
</pre>
 +
上の1行は簡単に見えますが、まず3.1415という数値がDouble型のクラスに変換され、toString()メソッドにより文字列型に変換されてから、StringBufferという別のクラスが内部的に呼び出されて文字列を結合する処理が裏で行われます。
  
===クラス===
+
===クラスライブラリ===
オブジェクト単位でデータを管理するのに、クラスを定義します。
+
Javaの特徴は優れた標準クラスライブラリが付属していることです。
 +
ライブラリのクラス一覧は[http://java.sun.com/javase/ja/6/docs/ja/api/ Java A
  
;File List.java
+
PI仕様]で参照できます。
<pre>
+
ライブラリの使い方等は上記のサイトを参照するのが一番便利です。
class ListRep { // publicなclassではない(List.java中に書ける。)
+
ライブラリを自分のプログラム中で利用するには、<tt>import</tt>コマンドを使います。
  Object obj;
+
よく使うのは、
  ListRep(Object o) { obj = o; } // コンストラクタ
+
* java.io.*
  ListRep prev;
+
* java.text.*
  ListRep next;
+
* java.util.*
  public Object inf() { return obj; }
+
などでしょう。
}
+
  
public class List {
+
====I/Oライブラリと例外処理====
  ListRep head =null;
+
Javaでファイルとの入出力を行う際には、必ず例外処理(exception)の手続きをしなくてはなりません。
  ListRep tail =null;
+
処理する内容は<tt>try{ 通常処理 } catch (Exception e) { 例外処理 }</tt>の構文で記述します。キャッチするExceptionには様々なサブクラスがあり、例外毎に異なる処理を行える仕組みになっています。
  int size =0;
+
{| class="wikitable" style="width:20%; float:right"
 +
! 例外処理
 +
|-
 +
| プログラムの実行中に予期しない異常が発生した際に行う手続きのこと。
 +
例えば開こうとしたファイルが存在しなかったり、アクセスできなかったりする入出力関係の例外が代表的。
 +
|}
  
  List() {}          //コンストラクタ
+
; ファイルから1行ずつ読み込んで正規表現検索をする Grep.java
 +
<pre>
 +
import java.io.*;        // ioライブラリの全クラスを使えるようにする。
 +
import java.util.regex.*;
  
   void push(Object o)
+
public class Grep {
  { ListRep r = new ListRep(o);
+
   public static void main(String[] args)
    if (size > 0) head.prev = r; else tail = r;
+
    {
    r.next = head;
+
      if (args.length < 2)
    head = r;
+
        { System.err.println("Usage: Grep pattern file");  
    size&#43;&#43;;
+
          System.exit(1);
  }
+
        }
 +
      try {
 +
        Pattern p = Pattern.compile(args[0]); // java.util.regexで定義される正規表現
 +
        BufferedReader br= new BufferedReader
 +
          (new FileReader(args[1]));         // java.ioで定義されるクラス
 +
        String line;
 +
        while ((line = br.readLine()) != null) {
 +
          Matcher m = p.matcher(line);
 +
          if (m.find()) System.out.println(line);
 +
        }
 +
      } catch (Exception e) { e.printStackTrace(); }
 +
    }
 +
}
 +
</pre>
 +
実行例
 +
<pre>
 +
$ java Grep Grep Grep.java
 +
public class Grep {
 +
        { System.err.println("Usage: Grep pattern file");
  
  Object pop()
+
$
  { ListRep x = head;
+
</pre>
    if (x != null)
+
      { ListRep y = x.next;
+
        head = y;
+
        if (y != null) y.prev = null; else tail = null;
+
        size--;
+
        return x.inf();
+
      }
+
    else
+
      { System.err.println("Accessing empty list.");
+
        System.exit(1);
+
      }
+
  }
+
  
  void append(Object o)
+
===クラス===
  { ListRep r = new ListRep(o);
+
オブジェクト単位でデータを管理するのに、クラスを定義します。
    if (size > 0) tail.next = r; else head = r;
+
    r.prev = tail;
+
    tail = r;
+
    size&#43;&#43;;
+
  }
+
  
  int size() { return size; }
+
* [[Aritalab:Lecture/Programming/Java/LinkedList|二重リンクリスト]]
  boolean empty() { return (size==0); }
+
 
+
  //サンプルプログラム
+
  static public void main(String[] args)
+
  { List L = new List();
+
    for(int i=0; i < 10; i++)
+
      L.push(i);
+
    while (!L.empty())
+
      System.out.println(L.pop());
+
  }
+
}
+
</pre>
+

Revision as of 19:13, 5 October 2010

Contents

Java プログラミング

プログラムの書き方

Eclipseのような統合環境でプログラムを書く場合、自動的にインデントが入ります。インデントはプログラムを読みやすくする(特に{}の対応)ために入れるので、崩さないようにしましょう。Emacsの場合は、JDEなどを使ってください。

Eclipseの場合は、Menu→Source→Formatで崩れたインデントを修正できます。自分流にインデントしたい人はPreferences→Java→Code Styleで変更できます。

コンパイルの仕方

全てのプログラムはクラスの集合として表現されます。 ファイル名はそのファイル内に記述するクラス名にします。 ファイル集合の中で、どこかに一箇所、スタートする位置としてmain関数をおきます。

Hello World!と書く Test.java
public class Test {
  public static void main(String[] args)
    {
      for(int i=0; i < args.length; i++)
        System.out.println(args[i]);
    }
}

コンパイルして実行してみましょう。

$ javac Test.java
[1]+  Done

$ java Test Hello World
Hello
World

基本データ型

変数は必ず型を持ち、異なる型の間では型変換を行う必要があります。 また、各基本データ型int, float, double等はクラスと互換性が無いため、それぞれInteger, Float, Doubleというクラスが用意されています。

浮動小数点の精度
Javaで小数とfloatを一緒に使うと、「精度が落ちている」とエラーになります。メモリは気にせず常にdoubleを使いましょう。
 float  f = 3.14;  // コンパイルエラー。精度が落ちている。3.14fならOK
 double d = 3.14;  // OK

コンパイラは、自明な型変換なら自動で行ってくれます。

Integer I = 1;    // 基本データ型をIntegerクラスに型変換
int i = I;        // クラスIの中身を基本データ型に型変換

Javaのクラス定義における よく遭遇するのは、文字列型から数値への変換です。

String str = "3.1415";
float pi = Float.valueOf(str); // piに3.1415という数値が入る。
int pi = Integer.valueOf(str); // コンパイルエラー。3.1415は整数ではない。

逆に、数値を文字列にするには+記号で大丈夫です。この演算子はオブジェクトに定義されるtoString()というメソッドを呼び出して文字列をつなぎます。

String str = "Value of pi is " + 3.14;

上の1行は簡単に見えますが、まず3.1415という数値がDouble型のクラスに変換され、toString()メソッドにより文字列型に変換されてから、StringBufferという別のクラスが内部的に呼び出されて文字列を結合する処理が裏で行われます。

クラスライブラリ

Javaの特徴は優れた標準クラスライブラリが付属していることです。 ライブラリのクラス一覧は[http://java.sun.com/javase/ja/6/docs/ja/api/ Java A

PI仕様]で参照できます。 ライブラリの使い方等は上記のサイトを参照するのが一番便利です。 ライブラリを自分のプログラム中で利用するには、importコマンドを使います。 よく使うのは、

  • java.io.*
  • java.text.*
  • java.util.*

などでしょう。

I/Oライブラリと例外処理

Javaでファイルとの入出力を行う際には、必ず例外処理(exception)の手続きをしなくてはなりません。 処理する内容はtry{ 通常処理 } catch (Exception e) { 例外処理 }の構文で記述します。キャッチするExceptionには様々なサブクラスがあり、例外毎に異なる処理を行える仕組みになっています。

例外処理
プログラムの実行中に予期しない異常が発生した際に行う手続きのこと。

例えば開こうとしたファイルが存在しなかったり、アクセスできなかったりする入出力関係の例外が代表的。

ファイルから1行ずつ読み込んで正規表現検索をする Grep.java
import java.io.*;         // ioライブラリの全クラスを使えるようにする。
import java.util.regex.*;

public class Grep {
  public static void main(String[] args)
    {
      if (args.length < 2)
        { System.err.println("Usage: Grep pattern file"); 
          System.exit(1);
        }
      try {
        Pattern p = Pattern.compile(args[0]); // java.util.regexで定義される正規表現
        BufferedReader br= new BufferedReader
          (new FileReader(args[1]));          // java.ioで定義されるクラス
        String line;
        while ((line = br.readLine()) != null) {
          Matcher m = p.matcher(line);
          if (m.find()) System.out.println(line);
        }
      } catch (Exception e) { e.printStackTrace(); }
    }
}

実行例

$ java Grep Grep Grep.java
public class Grep {
        { System.err.println("Usage: Grep pattern file");

$

クラス

オブジェクト単位でデータを管理するのに、クラスを定義します。

Personal tools
Namespaces

Variants
Actions
Navigation
metabolites
Toolbox