0

統計 + 実績システムを実装しています。基本的に構造は次のとおりです。

  • アチーブメントには関連する多くの統計があります。この関係は、各アチーブメントを必要な統計 (およびその値) に関連付ける必要があります。たとえば、Achievement1 には値 50 (またはそれ以上) の Statistic1 と値 100 (またはそれ以上) の Statistic2 が必要です。
  • 統計が与えられた場合、関連する実績が何であるかも知る必要があります (統計が変更されたときにそれらを確認するためです。

Stats と Achievements の両方に一意の ID があります。

私の問題は、それを表すのに最適なデータ構造が何であるかがわからないことです。ちなみに私が使っているのは:

SparseArray<HashMap<Statistic, Integer>> statisticsForAnAchievement;

配列のインデックスが実績 ID であり、HashMap に Statistic/TargetValue のペアが含まれている最初のポイント。そして:

SparseArray<Collection<Achievement>> achievementsRelatedToAStatistic;

インデックスが StatisticID であり、アイテムがアチーブメント関連のコレクションである 2 番目のポイント。

次に、両方のオブジェクトを処理して一貫性を保つ必要があります。

それを表す簡単な方法はありますか?ありがとう

4

1 に答える 1

1

Statistic(またはグループStatistics)が説明しているように、それAchievement/それら/はクラスStatisticに保存されるべきではありませんか?Achievementたとえば、改良されたAchievementクラス:

public class Achievement {
    SparseArray<Statistic> mStatistics = new SparseArray<Statistic>();

    // to get a reference to the statisctics that make this achievement
    public SparseArray<Statistic> getStatics() {
        return mStatistics;
    }

    // add a new Statistic to these Achievement
    public void addStatistic(int statisticId, Statistic newStat) {
        // if we don't already have this particular statistic, add it
        // or maybe update the underlining Statistic?!?
        if (mStatistics.get(statisticId) == null) {
             mStatistic.add(newStat);
        }
    }

    // remove the Statistic
    public void removeStatistic(int statisticId) {
        mStatistic.delete(statisticId);
    }

    // check to see if this achievment has a statistic with this id
    public boolean hasStatistics(int statisticId) {
        return mStatistic.get(statisticId) == null ? false : true;
    }

    // rest of your code
}

また、Statisticクラスはそのターゲット (Statistic1 の 50 の値) 値をフィールドとして格納する必要があります。

アチーブメントには関連する多くの統計があります。この関係は、各アチーブメントを必要な統計 (およびその値) に関連付ける必要があります。たとえば、Achievement1 には値 50 (またはそれ以上) の Statistic1 と値 100 (またはそれ以上) の Statistic2 が必要です。

統計はすでに実績に保存されているため、実績 (または実績自体) の ID の配列/リストを保存するだけで、これらの実績を作成した統計にアクセスできます。

統計が与えられた場合、関連する実績が何であるかも知る必要があります (統計が変更されたときにそれらを確認するためです。

上記の実績の配列/リストを使用し、それらを繰り返して、実績がその特定のものを保持しているかどうかを確認しますStatistic

ArrayList<Achievement> relatedAchievements = new ArrayList<Achievement>();
for (Achievement a : theListOfAchievments) {
     if (a.hasStatistics(targetStatistic)) {
          relatedAchievements.add(a); // at the end this will store the achievements related(that contain) the targetStatistic
     }
}

もう 1 つのオプションは、またはメソッドのいずれかが呼び出されるStatisticたびに更新される , マッピングを持つアチーブメントを保存する静的マッピングをどこかに置くことです。addStaticticremoveStatistic

コードに関しては、オブジェクト必要なく、Statisticオブジェクトへの参照を保持するだけで満足しているid場合は、次のように改善できますstatisticsForAnAchievement

SparseArray<SparseIntArray> statisticsForAnAchievement;
// the index of the SparseArray is the Achievement's id
// the index of the SparseIntArray is the Statistic's id
// the value of the SparseIntArray is the Statistic's value
于 2012-07-17T07:36:17.940 に答える