Mapを使用したクラス
ゲームのタイトルをキーにして会社名を値として保存するクラスの続き。
ひとつのデータを格納して会社名を取得するテストを追加する。
GamesTest.java
@Test public void testGet() { Games g = new Games(); g.add("スーパーマリオブラザーズ", "任天堂"); String s = g.get("スーパーマリオブラザーズ"); assertThat(s, is("任天堂")); }
このテストにパスするには、Fakeすればよい。
Games.java
import java.util.HashMap; import java.util.Map; public class Games { private Map<String, String> map = new HashMap<String, String>(); public void add(String title, String company) { map.put(title, company); } public int getCount() { return map.size(); } public String get(String string) { return "任天堂"; } }
さらにテストを追加する。
@Test public void testGet1() { Games g = new Games(); g.add("パズドラ", "ガンホー"); String s = g.get("パズドラ"); assertThat(s, is("ガンホー")); }
両方のテストをパスするためには、Mapを使用してきちんと実装するのがよい。
Games.java
public String get(String key) { return map.get(key); }
ファイルから読み込む
map.txt を作成して、タイトルと会社名のデータを書き込んでおく。
map.txt
スーパーマリオブラザーズ,任天堂 パズドラ,ガンホー 妖怪ウォッチ,レベルファイブ ドラゴンクエスト,スクエアエニックス
このファイルのデータを読み込むテストを作成する。
GamesTest.java
@Test public void testLoad() { Games g = new Games(); g.load("map.txt"); int n = g.getCount(); assertThat(n, is(4)); }
Gamesクラスにload()メソッドを追加して、指定されたファイルの内容を読み込み、マップに追加する。
ファイルを読み込む部分は、TextDocumentクラスのload()メソッドが参考になる。
Games.java
public boolean load(String path) { File f = new File(path); if (!f.exists()) return false; try (BufferedReader in = new BufferedReader(new FileReader(path))) { while (in.ready()) { String s = in.readLine(); String[] sa = s.split(","); map.put(sa[0], sa[1]); } } catch (IOException e) { e.printStackTrace(); } return true; }
テキストファイルに出力する機能を追加する
格納している内容をテキストファイルに出力し、出力したファイルを読み込んで行数が一致するかを確認するテストを作成する。
GamesTest.java
@Test public void testSave() { Games g = new Games(); g.add("パズドラ", "ガンホー"); g.save("map1.txt"); boolean result = g.load("map1.txt"); assertThat(result, is(true)); int n = g.getCount(); assertThat(n, is(1)); }
保存の処理内容は、TextDocumentクラスのsave()とほぼ同じ。
タイトルと会社名をカンマで区切って出力すればよい。
ループする部分はテキストp.444が参考になる。
Games.java
public void save(String path) { try (PrintWriter out = new PrintWriter(new FileWriter(path))) { Set<String> keys = map.keySet(); for (String key : keys) { String v = map.get(key); out.println(key + "," + v); } } catch (IOException e) { e.printStackTrace(); } }
要素の削除
指定したタイトルを削除する機能を追加する。
まずテストを作成する。
GamesTest.java
@Test public void testDelete() { Games g = new Games(); g.load("map.txt"); int n = g.getCount(); assertThat(n, is(4)); g.delete("パズドラ"); n = g.getCount(); assertThat(n, is(3)); String s = g.get("パズドラ"); assertNull(s); }
テストにパスするようにGames#delete()を実装する。
要素の削除はテキストには掲載されてないが、Eclipseの補完機能で表示される候補から探せば見つかる。