我会事先声明这不是一个家庭作业问题,而是我正在做的一个爱好项目的一部分。我有一个有效的解决方案,但我觉得我的解决方案很混乱,空间效率低下。
我有一个项目列表。
现在我正在使用两种数据结构来实现我的目标。
我有一个基于优先级排序的ArrayList(用于保持顺序),以及一个基于item键排序的ArrayList(用于快速查找)。
是否有单一的数据结构可以解决这个问题?如果重要的话我用Java编写代码。一个排序的集几乎是我想要的,但因为有重复我不认为这将工作
答案 0 :(得分:3)
由于您希望按键查找,因此您应该使用某种类型的地图。
由于您需要与同一个键关联的多个对象,因此您需要一个对象列表的键映射,而不是单个对象的键映射。
我会使用TreeMap进行排序,其中键是您的键,值是ArrayList,表示应该为该键返回的对象列表。
您必须实施比较器才能获得所需的分类。
使用列表地图时要考虑的一件事是,当您要添加项目时,需要检查地图是否已包含该键的列表。
E.g。如果您的地图如下所示:
Map<String, List<Object>> map = new TreeMap<String, ArrayList<Object>>();
添加对象如下所示:
public void addObject(String key, Object object) {
List<Object> objects = map.get(key);
if (objects == null) {
objects = new ArrayList<Object>();
map.put(key, objects);
}
objects.add(object);
}
答案 1 :(得分:0)
您正在寻找的内容在RDBMS中称为compound key。如果使用复合键(priority,key)创建ArrayList,则将具有单个数据结构。
答案 2 :(得分:0)
我不确定单数据结构,但您可以将ArrayList<>
与HashSet<>
创建一个包装类,其中包含Item
和priority
,我假设它是int
值。
class ItemWithPriority
{
private Item item;
private int priority;
ItemWithPriority(Item item, int priority)
{
this.item = item;
this.priority = priority;
}
}
维护ArrayList<ItemWithPriority>
始终根据自定义Comparator<ItemWithPriority>
进行排序,并根据priority
进行比较。
另外维护一个HashSet<Item>
,其中包含给定时间点的所有项目集。
插入强>
itemWithPriorityList.add(new ItemWithPriority(item, priority));
Collections.sort(itemWithPriorityList, new PriorityBasedComparator());
itemSet.add(item);
删除:(基于索引)
Item itemToBeRemoved = itemWithPriorityList.get(index);
itemWithPriorityList.remove(index);
itemSet.remove(itemToBeRemoved);
<强>查找强>
itemSet.contains(item)