2014年2月11日火曜日

テキストファイルを読み込む

テキストファイルを読み込むにはFileReaderクラスを使用します。

サンプルコード

import java.io.FileReader;
import java.io.IOException;

public class Test {
    public static void main(String[] args) {
        StringBuilder text = new StringBuilder();
        try {
            // ファイルのパスを指定してFileReaderを作成
            FileReader fr = new FileReader("text.txt");
            
            // テキストを読み込むためのバッファーを作成
            char[] buffer = new char[1024];
            
            int len = 0;
            // FileReader#read()を使ってバッファーにテキストを読み込む
            while ( (len = fr.read(buffer,0,buffer.length)) != -1 ) {
                // バッファーの内容を結果を格納するStringBuilderに追加
                text.append(buffer, 0, len);
            }
            fr.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        // 読み込んだ内容を表示
        System.out.println(text);
    }
}

説明

このサンプルコードは"text.txt"というファイルを読み込んでその内容を表示します。
FileReaderコンストラクタやFileReader#read()はIOExceptionをスローするため、try-catchにより例外処理を行っています。
テキストの読み込みはFileReader#read()により行っています。ファイルのサイズが大きい場合、FileReader#read()で一度に内容を読み込むことができないため、FileReaderの読み込むテキストがなくなるまでループして読み込んだ内容をtext(StringBuilder)にappendしています。

文字列の部分文字列を取得する

文字列の中から部分の文字列を取得するにはString#substring()を使用します。

シグニチャ

String substring(int beginIndex)
String substring(int beginIndex, int endIndex)

説明

この文字列の部分文字列である新しい文字列を返します。部分文字列は、指定された beginIndex から始まり、インデックス endIndex - 1 にある文字までです。したがって、部分文字列の長さは endIndex-beginIndex になります。 

サンプルコード

public class Test {
    public static void main(String[] args) {
        System.out.println("ABCDEF".substring(2));
        System.out.println("ABCDEF".substring(2,4));
    }
}

出力

CDEF
CD

リファレンス

String#substring(int)
String#substring(int,int)

2014年2月10日月曜日

Mapを拡張for文でループする

Map(HashMap)そのものは拡張for文を使えませんが、Map#entrySet()の結果を拡張for
文に渡すことで、Mapの内容をループして取り出すことができます。

import java.util.HashMap;
import java.util.Map;

public class Test {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<String,String>();
        map.put("A", "1");
        map.put("B", "2");
        map.put("C", "3");
        
        for ( Map.Entry<String, String> entry : map.entrySet() ) {
            System.out.println(entry.getKey() + " " + entry.getValue());
        }
    }
}

出力

A 1
B 2
C 3

バブルソートの実装

隣り合う要素通しを比較して大小の関係が正しくない場合に交換するという操作を各要素について繰り返すことで整列させるアルゴリズムです。

ソースコード

public class Test {
    public static void main(String[] args) {
       int[] a = new int[]{3,2,5,4,1};
       dumpArray(a);
       for ( int i = 0; i < a.length - 1; i++ ) {
           for ( int j = 1; j < a.length; j++ ) {
               if ( a[j - 1] > a[j] ) {
                   int tmp = a[j - 1];
                   a[j - 1] = a[j];
                   a[j] =tmp;
               }
           }
           dumpArray(a);
       }
    }
    // 配列の内容を表示します
    private static void dumpArray(int[] a) {
        for ( int n : a ) {
            System.out.print(n + " ");
        }
        System.out.println();
    }
}

出力

3 2 5 4 1 
2 3 4 1 5 
2 3 1 4 5 
2 1 3 4 5 
1 2 3 4 5 

2014年2月9日日曜日

文字列を数値に変換する

文字列を数値に変換するにはIntegerクラスの静的メソッドを使用します。Integer型に変換する場合は Integer.valueOf()、int型に変換する場合は Integer.parseInt() を使用します。

16進数文字列

なお、両メソッドともに第二引数に文字列の進数を指定することができますので、下記のように16進数文字列を数値に変換することもできます。

Integer.valueOf("a", 16);

Longおよびlongへの変換

Longやlongに変換したい場合はLongクラスに用意されている同様の静的メソッドを使います。
Long.valueOf()
Long.parseLong()
を使用することで変換できます。

コード例

public class Test {
    public static void main(String[] args) {
       // 数値文字列を数値に変換
       String numstr = "100";
       Integer num1 = Integer.valueOf(numstr);
       int num2 = Integer.parseInt(numstr);
       
       // 16進数文字列を数値に変換
       String hexstr = "a";
       int num3 = Integer.parseInt(hexstr, 16);
    }
}

リファレンス



文字列を検索する

文字列の中から特定の文字列を検索するには String#indexOf() を使用します。

シグニチャ

int indexOf(String str)
int indexOf(String str, int fromIndex)

説明

strに指定した検索対象が見つかったインデックス位置を返します。検索の開始位置を指定する場合はfromIndexを指定します。

コード例

public class Test {
    public static void main(String[] args) {
       String text = "あいうあいう";
       System.out.println(text.indexOf("いう"));
       System.out.println(text.indexOf("いう", 2));
    }
}

出力

1
4

リファレンス

文字列が同じか判定する

2つの文字列が同じ文字列であるかを判定するにはString#equals()を使用します。Java以外のプログラミング言語では == 演算子で判定することができる場合が多いですが、Javaでは正しく動作しません。

コード例

public class Test {
    public static void main(String[] args) {
        String a1 = String.valueOf('a');
        String a2 = String.valueOf('a');
        if (a1.equals(a2)) {
            System.out.printf("matched");
        } else {
            System.out.printf("unmatched");
        }
    }
}

出力

mathched

なぜ==演算子で比較できないか

Javaではオブジェクトの==演算子は同一のオブジェクトであるかを示す演算子です。 文字列はString型というオブジェクトであり、intやcharのようなプリミティブ型ではないため==演算子は同一のオブジェクトである場合のみtrueとなります。 試しに上記のコード例を==演算子での比較に置き換えてみると結果が変わるのがわかります。