我正在开发一个应用程序,其中作为背景我需要监视特定对象的用户活动,然后当它们可视化时,需要根据用户使用它们的顺序进行排序(最后使用的对象必须是例如,在网格的第一行可视化。)
所以,如果我有一个Arraylist,我存储用户正在处理的对象,以便添加最后使用的对象,我需要检查它是否已经在列表中,然后在第一个位置移动它。如果对象不存在,我只需将其添加到列表的第一个位置。
因此,我没有做所有这些步骤,而是想制作我自己的列表,其中上面提到的逻辑将可用。
最后我的问题是(希望不是基于意见的)哪种情况更好:
答案 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;
}