统计和成就系统的数据结构

时间:2012-07-16 11:11:39

标签: java android

我正在实施统计+成就系统。基本上结构是:

  • 成就有很多相关的统计数据,这种关系必须将每个成就与所需的统计数据(和它的价值)联系起来。例如,Achievement1需要Statistic1的值为50(或更高),Statistic2的值为100(或更高)。
  • 鉴于统计数据,我还需要知道相关的成就是什么(为了在统计数据发生变化时进行检查。

统计数据和成就都有一个独特的身份。

我的问题是我不知道用于表示的最佳数据结构是什么。顺便说一下我正在使用:

SparseArray<HashMap<Statistic, Integer>> statisticsForAnAchievement;

对于数组的索引是Achievement ID并且HashMap包含Statistic / TargetValue对的第一个点。并且a:

SparseArray<Collection<Achievement>> achievementsRelatedToAStatistic;

对于索引是StatisticID的第二个点,该项目是与成就相关的集合。

然后我需要处理两个对象以保持连贯性。

是否有更简单的方式来表示?感谢

1 个答案:

答案 0 :(得分:1)

由于Statistic(或一组Statistics)描述Achievement不应该{/ 1}} / Statistic / s存储在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需要Statistic1的值   50(或更高)和Statistic2值100(或更高)。

统计数据已经存储在成就中,因此您所要做的就是存储成就的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
     }
}

另一种选择是在某处创建一个静态映射,用于存储哪些成就具有Statistic,每次调用addStaticticremoveStatistic方法之一时,映射都会更新。< / p>

关于您的代码,如果您不需要Statistic对象,并且对仅提及id的引用感到满意,那么您可以改进{{1 with:

statisticsForAnAchievement