快速解释:
我有一个哈希图,它根据列表的排序类型以不同的顺序存储列表。我希望将其存储在内存中,这样我就不必在运行时对每个列表进行排序,多次排序会对 CPU 使用造成很大的压力。
目前我有一个通用的HashMap,它存储所有项目及其相应的ID...
private Map<String, Cosmetic> cosmeticIDs;
然后,我将每个 ID 存储在一个列表中,该列表已根据 sortType 排序并插入到 HashMap 中,如下所示...
public enum SortType {
ALPHABETICALLY,
ALPHABETICALLY_REVERSE,
RARITY,
RARITY_REVERSE;
}
// List of Strings is the ID of each item
private EnumMap<SortType, List<String>> availableTrailsIDs;
private EnumMap<SortType, List<String>> availableGadgetsIDs;
private EnumMap<SortType, List<String>> availableSuitsIDs;
private EnumMap<SortType, List<String>> availablePetsIDs;
然后我使用以下命令在运行时获取排序后的地图:
List<String> gadgets = availableGadgets.get(sortType);
for (String gadgetID : gadgets.subList(min, max)) {
Cosmetic gadget = CosmeticHandler.getInstance().getCosmeticFromID(gadgetID);
// LOAD GADGETS IN ORDER
}
有更好的方法吗?这似乎是一个巨大的设计缺陷,并且浪费了大量的内存。
一个解决方案是做这样的事情
public enum SortType {
ALPHABETICALLY(new TreeSet<String>(/*you can have custom comparator Comparator.comparing... so you can use the cosmetic*/)) {
@Override
public Set<String> getSubSet(String min, String max) {
return set.subSet(min, max);
}
},
ALPHABETICALLY_REVERSE(ALPHABETICALLY.set) {
@Override
public Set<String> getSubSet(String min, String max) {
return set.descendingSet().subSet(min, max);
}
},
RARITY(new TreeSet<String>(/*you can have custom comparator Comparator.comparing... so you can use the cosmetic*/)) {
@Override
public Set<String> getSubSet(String min, String max) {
return set.subSet(min, max);
}
},
RARITY_REVERSE(RARITY.set) {
@Override
public Set<String> getSubSet(String min, String max) {
return set.descendingSet().subSet(min, max);
}
};
protected TreeSet<String> set;
private SortType(TreeSet<String> set) {
this.set = set;
}
public void add(String o) {
set.add(o);
}
public abstract Set<String> getSubSet(String min, String max);
}
您现在只需保留该集合的副本,具体取决于将项目添加到两个 TreeSet 的顺序。