我应该在Java中实现List接口或扩展ArrayList类

时间:2015-09-11 09:54:09

标签: java collections polymorphism

我正在开发一个应用程序,其中作为背景我需要监视特定对象的用户活动,然后当它们可视化时,需要根据用户使用它们的顺序进行排序(最后使用的对象必须是例如,在网格的第一行可视化。)

所以,如果我有一个Arraylist,我存储用户正在处理的对象,以便添加最后使用的对象,我需要检查它是否已经在列表中,然后在第一个位置移动它。如果对象不存在,我只需将其添加到列表的第一个位置。

因此,我没有做所有这些步骤,而是想制作我自己的列表,其中上面提到的逻辑将可用。

最后我的问题是(希望不是基于意见的)哪种情况更好:

  1. 实施列表界面
  2. 扩展ArrayList类并覆盖ADD方法
  3. 提前10倍。

2 个答案:

答案 0 :(得分:1)

我认为LinkedHashMap已经做了你需要的事情 - 它按照插入或上次访问的顺序保留元素(这由其中一个构造函数中的参数accessOrder决定)。

https://docs.oracle.com/javase/8/docs/api/java/util/LinkedHashMap.html

修改

我没有足够的声誉来评论,所以我把它放在这里:你实际上并不需要地图,所以Venkatesh的LinkedHashSet建议更好。

您可以这样做:

<T> void update(Set<T> set, T value) {
        set.remove(value);
        set.add(value);
}

然后

    LinkedHashSet<String> set = new LinkedHashSet<>();
    update(set, "a");
    update(set, "b");
    update(set, "c");
    update(set, "a");

    Iterator<String> it = new LinkedList<String>(set).descendingIterator();

    while (it.hasNext()) {
        System.out.println(it.next());
    }

输出:

a
c
b

答案 1 :(得分:1)

您可以尝试使用HashMap<Integer, TrackedObject>,其中TrackedObject是您要跟踪的对象的类。

当您的用户使用对象时,请执行

void trackObject(TrackedObject object)
{
  int x = hashMap.size();
  hashMap.add(Integer.valueOf(x), object);
}

然后当您想按使用顺序读出跟踪对象时:

TrackedObject[] getOrderedArray()
{
  TrackedObject[] array = new TrackedObject[hashMap.size()];
  for(int i = 0; i < hashMap.size(); i++)
  {
    array[i] = hashMap.get(Integer.valueOf(i));
  }
  return array;
}