我正在实施统计+成就系统。基本上结构是:
统计数据和成就都有一个独特的身份。
我的问题是我不知道用于表示的最佳数据结构是什么。顺便说一下我正在使用:
SparseArray<HashMap<Statistic, Integer>> statisticsForAnAchievement;
对于数组的索引是Achievement ID并且HashMap包含Statistic / TargetValue对的第一个点。并且a:
SparseArray<Collection<Achievement>> achievementsRelatedToAStatistic;
对于索引是StatisticID的第二个点,该项目是与成就相关的集合。
然后我需要处理两个对象以保持连贯性。
是否有更简单的方式来表示?感谢
答案 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
,每次调用addStatictic
或removeStatistic
方法之一时,映射都会更新。< / p>
关于您的代码,如果您不需要Statistic
对象,并且对仅提及id
的引用感到满意,那么您可以改进{{1 with:
statisticsForAnAchievement