<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">package com.example.wordbook.common;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * データ管理クラス
 */
public class DataManager implements Serializable {

	/** SerialVersionUID */
	private static final long serialVersionUID = 1L;

	/** 試験データ先頭 */
	private int mBase;
	/** 試験データ位置 */
	private int mPos;
	/** 試験データリスト（試験単位分） */
	private List&lt;Data&gt; mData;
	/** 一時保存試験データリスト（試験単位分） */
	private List&lt;Data&gt; mTemp;

	/** 解答 */
	private int mResult;
	/** ランダム試験データリスト */
	private List&lt;Data&gt; mRand;

	/**
	 * 初期化
	 * &lt;p&gt;
	 * 最初に呼び出すこと
	 * &lt;/p&gt;
	 * 
	 * @param base
	 *            試験データ先頭
	 */
	public void init(int base) {

		mBase = base;
		mPos = 0;
		mData = new ArrayList&lt;Data&gt;();
		mTemp = new ArrayList&lt;Data&gt;();

		mResult = -1;
		mRand = new ArrayList&lt;Data&gt;();
	}

	/**
	 * 位置更新（次へ）
	 * &lt;p&gt;
	 * 試験単位内の次に移動する&lt;br&gt;
	 * OKデータを飛ばす。試験単位終端なら試験終了。
	 * &lt;/p&gt;
	 * 
	 * @return true:試験継続/false:試験終了
	 */
	public boolean setNextPos() {

		// 再試験情報がOKの場合は次へ
		do {
			// 試験終了確認
			if (mPos &gt;= mData.size() - 1) {
				return false;
			}
			mPos++;
		} while ((mData.get(mPos).stat &amp; Data.STAT_OK) == Data.STAT_OK);

		return true;
	}

	/**
	 * 位置更新（再試験）
	 * &lt;p&gt;
	 * 試験単位内の先頭に移動する&lt;br&gt;
	 * OKデータを飛ばす。全OK時は全NGに再設定。
	 * &lt;/p&gt;
	 */
	public void setZeroPos() {

		// 再試験開始位置となるNGを検索
		mPos = -1;
		for (int i = 0; i &lt; mData.size(); i++) {
			if ((mData.get(i).stat &amp; Data.STAT_NG) == Data.STAT_NG) {
				mPos = i;
				break;
			}
		}
		// 全OK時は再試験情報をNGに設定
		if (mPos == -1) {
			for (int i = 0; i &lt; mData.size(); i++) {
				mData.get(i).stat &amp;= ~Data.STAT_RESULT;
				mData.get(i).stat |= Data.STAT_NG;
			}
			mPos = 0;
		}
	}

	/**
	 * 試験データ位置取得
	 * &lt;p&gt;
	 * 試験単位内のデータ位置を取得する
	 * &lt;/p&gt;
	 * 
	 * @return 試験データ位置
	 */
	public int getDataPos() {

		return mPos;
	}

	/**
	 * ページ更新
	 * &lt;p&gt;
	 * 試験単位分の試験データリストを更新する&lt;br&gt;
	 * 一時保存試験データリストが準備済みであること
	 * &lt;/p&gt;
	 * 
	 * @see #addTempList()
	 */
	public void setNextPage() {

		mPos = 0;
		mData.clear();
		mData.addAll(mTemp);
		mTemp.clear();
	}

	/**
	 * 一時保存データリスト追加
	 * &lt;p&gt;
	 * 一時保存データリストはページ更新後にクリアされる
	 * &lt;/p&gt;
	 * 
	 * @see #setNextPage()
	 * @param list
	 *            追加データリスト（null時は未処理）
	 */
	public void addTempList(List&lt;Data&gt; list) {
		if (list == null) {
			return;
		}

		mTemp.addAll(list);
	}

	/**
	 * 一時保存データリスト取得
	 * &lt;p&gt;
	 * 設定済みの一時保存データリストを返す
	 * &lt;/p&gt;
	 * 
	 * @return 一時保存データリスト
	 */
	public List&lt;Data&gt; getTempList() {

		return mTemp;
	}

	/**
	 * 試験データ先頭設定
	 * &lt;p&gt;
	 * 単語帳DBデータからの読み込み開始位置を設定する
	 * &lt;/p&gt;
	 * 
	 * @param base
	 *            試験データ先頭
	 */
	public void setBasePos(int base) {

		mBase = base;
	}

	/**
	 * 試験データ先頭取得
	 * &lt;p&gt;
	 * 単語帳DBデータからの読み込み開始位置を取得する
	 * &lt;/p&gt;
	 * 
	 * @return 試験データ先頭
	 */
	public int getBasePos() {

		return mBase;
	}

	/**
	 * Stat設定
	 * &lt;p&gt;
	 * 試験中のデータ（stat）を更新
	 * &lt;/p&gt;
	 * 
	 * @param stat
	 *            Stat
	 */
	public void setStat(int stat) {

		getData().stat = stat;
	}

	/**
	 * Flag設定
	 * &lt;p&gt;
	 * 試験中のデータ（flag）を更新
	 * &lt;/p&gt;
	 * 
	 * @param flag
	 *            Flag
	 */
	public void setFlag(int flag) {

		getData().flag = flag;
	}

	/**
	 * Data1設定
	 * &lt;p&gt;
	 * 試験中のデータ（data1）を更新
	 * &lt;/p&gt;
	 * 
	 * @param data
	 *            Data1
	 */
	public void setData1(String data) {

		getData().data1 = data;
	}

	/**
	 * Data2設定
	 * &lt;p&gt;
	 * 試験中のデータ（data2）を更新
	 * &lt;/p&gt;
	 * 
	 * @param data
	 *            Data2
	 */
	public void setData2(String data) {

		getData().data2 = data;
	}

	/**
	 * NG+1更新
	 * &lt;p&gt;
	 * 試験中のデータ（stat=NG/ng++）を更新
	 * &lt;/p&gt;
	 */
	public void addNG() {

		Data data = getData();
		data.stat &amp;= ~Data.STAT_RESULT;
		data.stat |= Data.STAT_NG;
		data.ng++;
	}

	/**
	 * OK+1更新
	 * &lt;p&gt;
	 * 試験中のデータ（stat=OK/ok++）を更新
	 * &lt;/p&gt;
	 */
	public void addOK() {

		Data data = getData();
		data.stat &amp;= ~Data.STAT_RESULT;
		data.stat |= Data.STAT_OK;
		data.ok++;
	}

	/**
	 * NGデータ項目数取得
	 * &lt;p&gt;
	 * 試験単位分のデータリストから集計
	 * &lt;/p&gt;
	 * 
	 * @return NGデータ項目数
	 */
	public int getNGCount() {
		int ng = 0;

		for (Data data : mData) {
			if ((data.stat &amp; Data.STAT_NG) == Data.STAT_NG) {
				ng++;
			}
		}

		return ng;
	}

	/**
	 * OKデータ項目数取得
	 * &lt;p&gt;
	 * 試験単位分のデータリストから集計
	 * &lt;/p&gt;
	 * 
	 * @return OKデータ項目数
	 */
	public int getOKCount() {
		int ok = 0;

		for (Data data : mData) {
			if ((data.stat &amp; Data.STAT_OK) == Data.STAT_OK) {
				ok++;
			}
		}

		return ok;
	}

	/**
	 * データ取得
	 * &lt;p&gt;
	 * 試験中のデータを返す&lt;br&gt;
	 * 試験単位外の場合は num=0 のダミーデータを返す
	 * &lt;/p&gt;
	 * 
	 * @return データ
	 */
	public Data getData() {
		if (mPos &lt; 0 || mPos &gt;= mData.size()) {
			return new Data(0, 0, 0, 0, 0, 0, "", "", "", "");
		}

		return mData.get(mPos);
	}

	/**
	 * データリスト取得
	 * &lt;p&gt;
	 * 試験単位分のデータリストを返す
	 * &lt;/p&gt;
	 * 
	 * @return データリスト
	 */
	public List&lt;Data&gt; getDataList() {

		return mData;
	}

	/**
	 * 解答位置設定
	 * &lt;p&gt;
	 * （四択画面用）
	 * &lt;/p&gt;
	 * 
	 * @param result
	 *            解答位置
	 */
	public void setResult(int result) {

		mResult = result;
	}

	/**
	 * 解答位置取得
	 * &lt;p&gt;
	 * （四択画面用）
	 * &lt;/p&gt;
	 * 
	 * @return 解答位置
	 */
	public int getResult() {

		return mResult;
	}

	/**
	 * ランダム試験データリスト設定
	 * &lt;p&gt;
	 * （四択画面用）
	 * &lt;/p&gt;
	 * 
	 * @param rand
	 *            ランダム試験データリスト（null時は未処理）
	 */
	public void setRandList(List&lt;Data&gt; rand) {
		if (rand == null) {
			return;
		}

		mRand.clear();
		mRand.addAll(rand);
	}

	/**
	 * ランダム試験データリスト取得
	 * &lt;p&gt;
	 * （四択画面用）
	 * &lt;/p&gt;
	 * 
	 * @return ランダム試験データリスト（未初期化時のみnull）
	 */
	public List&lt;Data&gt; getRandList() {

		return mRand;
	}

}
</pre></body></html>