モデルファイルとCSV作成

商品データをCSV形式で作成し、ArrayListHashMapのデータに変換してみましょう。

ファイル構成

./
├── data/
│       └── item.csv
├── src/
│   └── rpg/
│       │     └── item/
│       │                 ├── Item.java
│       │                 ├── ItemList.java
│       │                 └── ItemType.java
│       └── ItemListApp.java

CSVファイル

CSVファイル「data/item.csv」を作成し、商品データを追加しておきいます。

id,name,type,price,attack_power,defence_power
1,ブロンズナイフ,weapon,300,5,0
2,シルバーナイフ,weapon,500,8,0
3,ブロンズアーマー,armor,500,0,3
4,シルバーアーマー,armor,800,0,6
5,ブロンズシールド,shield,300,0,2
6,シルバーシールド,shield,500,0,4

ItemTypeの作成

「WEAPON」「ARMOR」「SHIELD」のenum ItemTypeを作成します。

item.ItemType.java
package rpg.item;

public enum ItemType {
    WEAPON, ARMOR, SHIELD;
}

ItemListの作成

ItemListクラスを作成し、ArrayListHashMapのインスタンス変数を初期化とコンストラクタを追加します。

item.ItemType.java
package rpg.item;

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

public class ItemList {

	public ArrayList<Item> list = new ArrayList<>();
	public Map<Long, Item> map = new HashMap<>();

	public ItemList() {

	}

}

CSV処理

CSVファイルパス

ItemTypeクラスに、CSVファイルのパスを定数で設定します。

item.ItemType.java
public class ItemList {

	private static String CSV_PATH = "data/item.csv";
    ...

}

CSV読み込み(1行目)

loadCSV() 作成

CSV読み込みメソッドloadCSV() を作成し、コンストラクタで実行します。loadCSV() ではファイル操作の変数を用意しておきます。

item.ItemType.java
public class ItemList {

	private final static String CSV_PATH = "data/rpg/item.csv";
	public ArrayList<Item> list = new ArrayList<>();
	public Map<Long, Item> map = new HashMap<>();

	public ItemList() {
        // コンストラクタで実行
		this.loadCsv();
	}

    // CSV読み込みメソッド
	public void loadCsv() {
        //ファイル操作の変数用意
		FileInputStream file;
		InputStreamReader reader;
		BufferedReader buffer;
	}
}

CSV読み込み(1行目)

CSVファイルを開き、1行読み込みます。ファイルを開くときは、try-catchが必要です。

item.ItemType.java
	public void loadCsv() {
		FileInputStream file;
		InputStreamReader reader;
		BufferedReader buffer;

		try {
			// ファイル操作
			file = new FileInputStream(CSV_PATH);
			reader = new InputStreamReader(file);
			buffer = new BufferedReader(reader);

			// 1行読み込み
			String line = buffer.readLine();
			System.out.println(line);

		} catch (Exception e) {
			System.out.println(CSV_PATH + "が読み込めませんでした");
		} finally {

		}
	}

ファイルから1行読み込みました。

結果
id,name,type,price,attack_power,defence_power

CSV読み込み(2行目以降)

String.split()

String.split() は、セパレーター(区切り)を使って、データを String[] に変換します。

String[] data = String.split(セパレーター);

CSV形式であれば、セパレーターを , に指定します。

String[] data = String.split(",");

繰り返し読み込み

while文を使ってファイルを1行ずつ読み込み、行末まで繰り返します。

item.ItemType.java
	public void loadCsv() {
		FileInputStream file;
		InputStreamReader reader;
		BufferedReader buffer;

		try {
			file = new FileInputStream(CSV_PATH);
			reader = new InputStreamReader(file, "UTF-8");
			buffer = new BufferedReader(reader);

			String line = buffer.readLine();

		    // 行末まで繰り返し
			while ((line = buffer.readLine()) != null) {
				// ファイルを1行ずつ読み込み
				String[] data = line.split(",");
				System.out.println(data[0]);
			}
		} catch (Exception e) {
			System.out.println(CSV_PATH + "が読み込めませんでした");
		} finally {

		}
	}

CSVファイルの1列目(index = 0)のデータが繰り返し表示されました。

結果
1
2
3
4
5
7

Itemデータの作成

CSVデータを、Itemクラスのデータに変換します。このとき、CSVデータはString型なので、データ型にあわせて設定が必要です。

item.ItemType.java
	public void loadCsv() {
		FileInputStream file;
		InputStreamReader reader;
		BufferedReader buffer;

		try {
			file = new FileInputStream(CSV_PATH);
			reader = new InputStreamReader(file, "UTF-8");
			buffer = new BufferedReader(reader);

			String line = buffer.readLine();
			System.out.println(line);

			while ((line = buffer.readLine()) != null) {
				String[] data = line.split(",");

				Long id = Long.parseLong(data[0]);
				String name = data[1];
				ItemType type = ItemType.valueOf(data[3].toUpperCase());
				Integer price = Integer.parseInt(data[3]);
				Integer attackPower = Integer.parseInt(data[4]);
				Integer defencePower = Integer.parseInt(data[5]);

				Item item = new Item(id, name, type, price, attackPower, defencePower);
				list.add(item);
				map.put(id, item);
			}
		} catch (FileNotFoundException e) {
			System.out.println(CSV_PATH + "が読み込めませんでした");
		} catch (IOException e) {
			System.out.println("データエラー");
		} catch (Exception e) {
			System.out.println("予期せぬエラー");
		}
	}