有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

包含max元素的java列表

我想用java创建一个列表,在添加新元素时,它将检查是否达到了限制。如果是,请删除最旧的元素

我正在考虑将ArrayList的子对象化并覆盖add(Object)。在这里,我要说:

if(size() + 1 > MAX)
    remove(get(0));
super.add(newObject);

还有更好的办法吗


共 (6) 个答案

  1. # 1 楼答案

    你可以按照你描述的方式来做,但是这样一个列表的性能很低。假设已经达到极限,您移除了第一个元素。在幕后,这将涉及将基础数组的所有元素向上复制一个索引。然后新元素被添加到最后一个索引中。尤其是复制所有元素的成本很高

    或者,您可以使用LinkedList,这对此类操作更有效

    另一种方法是编写自己的类来实现Circular Buffer。 这基本上是一个最大大小的数组。你必须保留第一个元素的索引和数组中元素的数量。添加元素时,检查元素数是否等于MAX,如果是,则覆盖第一个元素并将第一个元素的索引增加一。 索引的getter和setter也需要考虑第一个元素的偏移量,但这并不太复杂

    最佳选择取决于您的用例。如果必须在列表中的任意位置执行大量插入和删除操作,LinkedList绝对是一种方法。如果您只想在末尾添加项目并移除头部,那么循环缓冲区非常有效

  2. # 2 楼答案

    您可以使用Deque

    private final int LIMIT = 10;
    
    private Deque<String> queue = new ArrayDeque<String>(LIMIT);
    
    public void addToList(final String element) {
       Deque<String> queue = new ArrayDeque<String>(LIMIT);
       if (!queue.offer(element)) {
          queue.removeFirst();
          queue.offer(element);
       }
    }
    
  3. # 3 楼答案

    在我看来,您应该使用带有列表包装器的数组。然后你可以做任何你想做的事。还可以添加返回列表的方法,例如get

  4. # 4 楼答案

    制作自己的课程来完成这项工作。跟踪两个变量。一个表示零元素,另一个表示下一个元素的位置

    public class MyList<T>
    {
        private T array[];
        private int first;
        private int next;
        private int count;
    
        public MyList(int count)
        {
            array = new T[count];
        }
    
        public void add(T obj)
        {
            array[next++] = obj;
            next %= array.length;
            if (count == array.length)
            {
                zero = (zero + 1) % array.length;
            } else count++;
        }
    
        public T get(int index)
        {
            return array[(zero + index) % array.length];
        }
    }
    
  5. # 5 楼答案

    对此可能有很多解决方案,但我认为如果您做一个更改,您的方法是合适的:您的底层实现类应该是^{},而不是^{}。原因是,当你在一个ArrayList上调用remove时,移除值之后的每个元素都必须上移(使remove(0)成为最坏的情况!)。然而,这对LinkedList来说不是问题