Aritalab:Lecture/Programming/Java

From Metabolomics.JP
< Aritalab:Lecture | Programming(Difference between revisions)
Jump to: navigation, search
(I/Oライブラリと例外処理)
Line 128: Line 128:
 
           (new FileReader(args[1]));          // java.ioで定義されるクラス
 
           (new FileReader(args[1]));          // java.ioで定義されるクラス
 
         String line;
 
         String line;
         while ((line = br.readLine()) != null) {
+
         while ((line = br.readLine()) != null)
           Matcher m = p.matcher(line);
+
           if (p.matcher(line).find())
          if (m.find()) System.out.println(line);
+
            System.out.println(line);
        }
+
 
       } catch (Exception e) { e.printStackTrace(); }
 
       } catch (Exception e) { e.printStackTrace(); }
 
     }
 
     }

Revision as of 14:27, 21 October 2010

Wiki Top Up one level レポートの書き方 Arita Laboratory

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の中身を基本データ型に型変換

Stringクラスとchar[]

Javaで文字列を扱うときはStringクラスを使うのが一般的です。 C言語のようにchar配列も使えますが、Stringクラスのほうが圧倒的に便利です。 Java API仕様のString Classは熟読しておきましょう。

String str = "abcde";
String str2 = str.substring(1, 3);          //部分文字列の取得
String str3 = str.replaceAll("[bc]", "ff"); //正規表現による置換
String str4 = str.split("[bd]");            //正規表現による分割
String str5 = str.trim();                   //前後の空白を除いたコピー作成
String str6 = str.toLowerCase();            //小文字変換

Objectとvoid*

C言語におけるvoid*型は、あらゆるポインタ型の代用となる点でJavaのObject型に似ています。 Object型はあらゆるクラスの基底クラスの型にあたります。

Integer i = 1;
Double  d = 1.0;
Object obj = i; // エラーではない。
       obj = d; // エラーではない。
       obj += 3; // エラー。objは数値型ではない。

文字列と数字の変換

よく必要になるのは、文字列型から数値への変換です。

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.14という数値がDouble型のクラスに変換され、toString()メソッドにより文字列型に変換されてから、StringBufferという別のクラスが内部的に呼び出されて文字列を結合する処理が内部的に行われています。

クラス

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

クラスライブラリ

Javaの特徴は優れた標準クラスライブラリが付属していることです。 ライブラリのクラス一覧はJava API仕様で参照できます。 ライブラリの使い方等は上記のサイトを参照するのが一番便利です。 ライブラリを自分のプログラム中で利用するには、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)
          if (p.matcher(line).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");

$

UNIXコマンドよりずっと遅い理由はJavaの仮想マシンを起動するコスト、入出力、正規表現ライブラリが原因です。UNIXコマンドのページも参照してください。

プログラム例

Personal tools
Namespaces

Variants
Actions
Navigation
metabolites
Toolbox