Aritalab:Lecture/Programming/Java

From Metabolomics.JP
< Aritalab:Lecture | Programming(Difference between revisions)
Jump to: navigation, search
(I/Oライブラリと例外処理)
m
 
(13 intermediate revisions by one user not shown)
Line 6: Line 6:
 
Eclipseの場合は、Menu&rarr;Source&rarr;Formatで崩れたインデントを修正できます。自分流にインデントしたい人はPreferences&rarr;Java&rarr;Code Styleで変更できます。
 
Eclipseの場合は、Menu&rarr;Source&rarr;Formatで崩れたインデントを修正できます。自分流にインデントしたい人はPreferences&rarr;Java&rarr;Code Styleで変更できます。
  
 +
; Eclipse における Project
 +
Eclipse では、記述するプログラムのセットを Project という概念で管理します。
 +
Eclipse の中で、まず File &rarr; New &rarr; Java Project を選択し、たとえば lecture というプロジェクト名を Project Name として入力して finish ボタンを押し、lecture というプロジェクトフォルダを作っておいてください。
 
===コンパイルの仕方===
 
===コンパイルの仕方===
 
全てのプログラムはクラスの集合として表現されます。
 
全てのプログラムはクラスの集合として表現されます。
Line 20: Line 23:
 
}
 
}
 
</pre>
 
</pre>
コンパイルして実行してみましょう。
+
左側のファイルツリーの中にある lecture プロジェクトを選択した状態で File &rarr; New &rarr; Class として新しい Java class を作成します。クラス名は Test としてください。(Javaではクラス名とその内容を記述するファイル名が一致しないといけません。) もし上のサンプルファイルでクラス名を Foo とするなら
 +
<pre>
 +
public class Foo {
 +
  (同じ内容)
 +
}
 +
</pre>
 +
クラス名は Foo とします。コンパイルして実行してみましょう。Eclipse の中でコンパイルするには Run &rarr; Run を選びます。すると右下のコンソール画面の部分に
 
<pre>
 
<pre>
$ javac Test.java
 
[1]+  Done
 
 
$ java Test Hello World
 
 
Hello
 
Hello
 
World
 
World
 
</pre>
 
</pre>
 +
と出てきます。
  
 
==基本データ型==
 
==基本データ型==
Line 85: Line 91:
 
String str = "Value of pi is " + 3.14;
 
String str = "Value of pi is " + 3.14;
 
</pre>
 
</pre>
上の1行は簡単に見えますが、まず3.1415という数値がDouble型のクラスに変換され、toString()メソッドにより文字列型に変換されてから、StringBufferという別のクラスが内部的に呼び出されて文字列を結合する処理が処理系の中で行われます。
+
上の1行は簡単に見えますが、まず3.14という数値がDouble型のクラスに変換され、toString()メソッドにより文字列型に変換されてから、StringBufferという別のクラスが内部的に呼び出されて文字列を結合する処理が内部的に行われています。
  
 
==クラス==
 
==クラス==
Line 128: Line 134:
 
           (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(); }
 
     }
 
     }
 
}
 
}
 
</pre>
 
</pre>
実行例 (UNIXコマンドよりずっと遅い理由は入出力と正規表現ライブラリが原因です)
+
実行例
 
<pre>
 
<pre>
 
$ java Grep Grep Grep.java
 
$ java Grep Grep Grep.java
Line 144: Line 149:
 
$
 
$
 
</pre>
 
</pre>
 +
UNIXコマンドよりずっと遅い理由はJavaの仮想マシンを起動するコスト、入出力、正規表現ライブラリが原因です。[[Aritalab:Lecture/Programming/Unix|UNIXコマンドのページ]]も参照してください。
  
 +
==並列プログラミング==
 +
[[Aritalab:Lecture/Programming/Java/Parallel|別ページ]]で紹介しています。
 
==プログラム例==
 
==プログラム例==
 +
* [[Aritalab:Lecture/Programming/Java/Grep|Grepプログラム]]
 +
* [[Aritalab:Lecture/Programming/Java/FileRead|ファイル入出力]]
 
* [[Aritalab:Lecture/Programming/Java/LinkedList|二重リンクリスト]]
 
* [[Aritalab:Lecture/Programming/Java/LinkedList|二重リンクリスト]]
 +
* [[Aritalab:Lecture/Programming/Java/Random|乱数生成]]
 +
* [[Aritalab:Lecture/Programming/Java/Calculator|逆ポーランド記号計算機]]
 
* [[Aritalab:Lecture/Programming/Java/Sudoku|数独ソルバー]]
 
* [[Aritalab:Lecture/Programming/Java/Sudoku|数独ソルバー]]

Latest revision as of 01:06, 2 July 2012

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

Contents

[edit] Java プログラミング

[edit] プログラムの書き方

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

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

Eclipse における Project

Eclipse では、記述するプログラムのセットを Project という概念で管理します。 Eclipse の中で、まず File → New → Java Project を選択し、たとえば lecture というプロジェクト名を Project Name として入力して finish ボタンを押し、lecture というプロジェクトフォルダを作っておいてください。

[edit] コンパイルの仕方

全てのプログラムはクラスの集合として表現されます。 ファイル名はそのファイル内に記述するクラス名にします。 ファイル集合の中で、どこかに一箇所、スタートする位置として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]);
    }
}

左側のファイルツリーの中にある lecture プロジェクトを選択した状態で File → New → Class として新しい Java class を作成します。クラス名は Test としてください。(Javaではクラス名とその内容を記述するファイル名が一致しないといけません。) もし上のサンプルファイルでクラス名を Foo とするなら

public class Foo {
  (同じ内容)
}

クラス名は Foo とします。コンパイルして実行してみましょう。Eclipse の中でコンパイルするには Run → Run を選びます。すると右下のコンソール画面の部分に

Hello
World

と出てきます。

[edit] 基本データ型

変数は必ず型を持ち、異なる型の間では型変換を行う必要があります。 また、各基本データ型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の中身を基本データ型に型変換

[edit] 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();            //小文字変換

[edit] Objectとvoid*

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

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

[edit] 文字列と数字の変換

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

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という別のクラスが内部的に呼び出されて文字列を結合する処理が内部的に行われています。

[edit] クラス

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

[edit] クラスライブラリ

Javaの特徴は優れた標準クラスライブラリが付属していることです。 ライブラリのクラス一覧はJava API仕様で参照できます。 ライブラリの使い方等は上記のサイトを参照するのが一番便利です。 ライブラリを自分のプログラム中で利用するには、importコマンドを使います。 よく使うのは、

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

などでしょう。

[edit] 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コマンドのページも参照してください。

[edit] 並列プログラミング

別ページで紹介しています。

[edit] プログラム例

Personal tools
Namespaces

Variants
Actions
Navigation
metabolites
Toolbox