Java - 在内存中存储排序列表值

问题描述 投票:0回答:1

快速解释:

我有一个哈希图,它根据列表的排序类型以不同的顺序存储列表。我希望将其存储在内存中,这样我就不必在运行时对每个列表进行排序,多次排序会对 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
}

有更好的方法吗?这似乎是一个巨大的设计缺陷,并且浪费了大量的内存。

java list sorting memory hashmap
1个回答
0
投票

一个解决方案是做这样的事情

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 的顺序。

© www.soinside.com 2019 - 2024. All rights reserved.