Java массивы как добавить элементы в начале



Мне нужно добавить элементы в ArrayList очередь что угодно, но когда я вызываю функцию, чтобы добавить элемент, я хочу, чтобы он добавил элемент в начале массива (так что он имеет самый низкий индекс), и если массив имеет 10 элементов, добавляющих новые результаты в удалении самого старого элемента (тот, у которого самый высокий индекс).



есть ли у кого-нибудь предложения?

1018   12  

12 ответов:

List имеет способ add(int, E), так что вы можете использовать:

list.add(0, yourObject);

после этого вы можете удалить последний элемент, с:

if(list.size() > 10)
    list.remove(list.size() - 1);

тем не менее, вы можете пересмотреть свои требования или использовать другую структуру данных, например Queue

EDIT

может быть, взгляните на Apache CircularFifoQueue:

CircularFifoQueue-это в первую очередь с фиксированный размер, который заменяет его самый старый элемент, если он заполнен.

просто инициализировать его с вами максимальный размер:

CircularFifoQueue queue = new CircularFifoQueue(10);

Использование Конкретных Структур

существуют различные структуры данных, которые оптимизированы для добавления элементов в первого индекса. Однако имейте в виду, что если вы преобразуете свою коллекцию в одну из них, разговор, вероятно, потребует временной и пространственной сложности O(n)

Deque

JDK включает в себя Deque структура, которая предлагает такие методы, как addFirst(e) и offerFirst(e)

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

анализ

пространственно-временная сложность вставки с LinkedList константа (O(1)). Смотрите Big-O cheatsheet.

реверсирование списка

очень простой, но неэффективный метод заключается в использовании обратного:

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

если вы используете потоки Java 8, этот ответ может вас заинтересовать.

анализ

  • Сложность : O(n)
  • Космос Сложность: O(1)

смотреть на!--48-->реализация JDK это O(n) сложность времени так подходит только для очень маленьких списков.

вы можете взглянуть на добавить (индекс int, элемент 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

С documentation: -

CircularFifoBuffer является первым в первом из буфера с фиксированным размером это заменяет его самый старый элемент, если полный.

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

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

как вы можете видеть, когда максимальный размер достигнут, то добавление нового элемента автоматически удаляет первый вставленный элемент.

Я думаю, что реализация должна быть простой, но учитывая эффективность, Вы должны использовать 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);
        }
    }
}

Java LinkedList предоставляет как метод addFirst(E e), так и метод push (E e), который добавляет элемент в начало списка.

https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html#addFirst(E)

вы можете использовать этот код

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);
    }
}

можно использовать

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

}

изменить E с вашим типом данных

Если удаление самого старого элемента необходимо, то вы можете добавить:

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

перед оператором возврата. В противном случае список добавит ваш объект в начале, а также сохранит самый старый элемент.

это приведет к удалению последнего элемента в списке.

вы можете использовать методы списка, удалить и добавить

list.add(lowestIndex, element);
list.remove(highestIndex, element);

У меня была аналогичная проблема, пытаясь добавить элемент в начале существующего массива, сдвинуть существующие элементы вправо и отбросить самый старый (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

удачи

import java.util.*:
public class Logic {
  List<String> list = new ArrayList<String>();
  public static void main(String...args) {
  Scanner input = new Scanner(System.in);
    Logic obj = new Logic();
      for (int i=0;i<=20;i++) {
        String string = input.nextLine();
        obj.myLogic(string);
        obj.printList();
      }
 }
 public void myLogic(String strObj) {
   if (this.list.size()>=10) {
      this.list.remove(this.list.size()-1);
   } else {
     list.add(strObj); 
   }
 }
 public void printList() {
 System.out.print(this.list);
 }
}

Comments

    Ничего не найдено.