length - java array用法




Java Arrays如何在开始时添加元素 (8)

我需要将元素添加到ArrayList队列中,但是当我调用函数来添加元素时,我希望它在数组的开头添加元素(因此它具有最低的索引),并且如果数组有10个元素添加删除最旧元素(索引最高的元素)的新结果。

有没有人有什么建议?


使用特定的数据结构

有各种各样的数据结构被优化用于在第一个索引处添加元素。 但是,请注意,如果您将收藏集转换为其中一种,则对话可能需要时间和空间复杂度为O(n)

双端队列

JDK包含提供像addFirst(e)offerFirst(e)这样的方法的Deque结构,

Deque<String> deque = new LinkedList<>();
deque.add("two");
deque.add("one");
deque.addFirst("three");
//prints "three", "two", "one"

分析

插入的空间和时间复杂度是LinkedList常量( O(1) )。 参见Big-O作弊表

反转列表

一个非常简单但效率低下的方法是使用反向:

 Collections.reverse(list);
 list.add(elementForTop);
 Collections.reverse(list);

如果你使用Java 8流,这个答案可能会让你感兴趣。

分析

  • 时间复杂度: O(n)
  • 空间复杂性: O(1)

查看JDK实现,这具有O(n)时间复杂度,因此仅适用于非常小的列表。



你可以使用这段代码

private List myList = new ArrayList();
private void addItemToList(Object obj){
    if(myList.size()<10){
      myList.add(0,obj);
    }else{
      myList.add(0,obj);
      myList.remove(10);
    }
}

你可以看看add(int index,E元素)

将指定的元素插入此列表中的指定位置。 将当前位置的元素(如果有的话)和任何后续元素移到右侧(将其中的一个添加到它们的索引)。

一旦添加完,你就可以检查ArrayList的大小并在最后删除它们。


你所描述的是使用Queue的合适情况。

既然你想add新元素,并remove旧元素。 您可以在最后添加,并从头开始删除。 这不会有很大的区别。

队列具有方法add(e)remove() ,它们在结尾处添加新元素,并分别从开始处移除旧元素。

Queue<Integer> queue = new LinkedList<Integer>();
queue.add(5);
queue.add(6);
queue.remove();  // Remove 5

所以,每次将一个元素添加到queue都可以使用remove方法调用进行备份。

更新 : -

如果你想修复Queue的大小 ,那么你可以看看: - ApacheCommons#CircularFifoBuffer

ApacheCommons#CircularFifoBuffer : -

CircularFifoBuffer是一个具有固定大小的先进先出缓冲区,如果已满,它将替换其最早的元素。

Buffer queue = new CircularFifoBuffer(2); // Max size

queue.add(5);
queue.add(6);
queue.add(7);  // Automatically removes the first element `5`

如您所见,当达到最大尺寸时,添加新元素会自动删除插入的第一个元素。


您可以使用

public List<E> addToListStart(List<E> list, E obj){
list.add(0,obj);
return (List<E>)list;

}

用你的数据类型改变E.

如果删除最老的元素是必要的,那么你可以添加:

list.remove(list.size()-1); 

在返回声明之前。 否则,列表将在开始时添加对象,并保留最早的元素。

这将删除列表中的最后一个元素。


我有一个类似的问题,试图在现有数组的开头添加一个元素,将现有元素向右移动并丢弃最老的元素(array [length-1])。 我的解决方案可能不是很高效,但它适用于我的目的。

 Method:

   updateArray (Element to insert)

     - for all the elements of the Array
       - start from the end and replace with the one on the left; 
     - Array [0] <- Element

祝你好运


我认为这个实现应该很容易,但考虑效率,你应该使用LinkedList而不是ArrayList作为容器。 你可以参考下面的代码:

import java.util.LinkedList;
import java.util.List;

public class DataContainer {

    private List<Integer> list;

    int length = 10;
    public void addDataToArrayList(int data){
        list.add(0, data);
        if(list.size()>10){
            list.remove(length);
        }
    }

    public static void main(String[] args) {
        DataContainer comp = new DataContainer();
        comp.list = new LinkedList<Integer>();

        int cycleCount = 100000000;

        for(int i = 0; i < cycleCount; i ++){
            comp.addDataToArrayList(i);
        }
    }
}




stack