哪种数据结构可以快速查找,可变长度和顺序?

时间:2015-05-26 18:20:11

标签: java algorithm sorting lookup

我会事先声明这不是一个家庭作业问题,而是我正在做的一个爱好项目的一部分。我有一个有效的解决方案,但我觉得我的解决方案很混乱,空间效率低下。

我有一个项目列表。

  • 列表的长度是可变的。项目按索引删除。项目将添加到列表的末尾。物品可以重复。
  • 查找项目时,只需检查它是否已在列表中。每个项目都有一个项目唯一的密钥'。
  • 根据用户指定的优先级对项目进行排序。

现在我正在使用两种数据结构来实现我的目标。

我有一个基于优先级排序的ArrayList(用于保持顺序),以及一个基于item键排序的ArrayList(用于快速查找)。

是否有单一的数据结构可以解决这个问题?如果重要的话我用Java编写代码。一个排序的集几乎是我想要的,但因为有重复我不认为这将工作

3 个答案:

答案 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<>

结合使用

创建一个包装类,其中包含Itempriority,我假设它是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)