Как имитировать ArrayList в Java?

У меня есть домашнее задание, чтобы имитировать структуру данных ArrayList в Java. Мне не разрешено использовать какие-либо сторонние структуры данных или что-либо в java.Utils.package.

Я застрял в том, как динамически увеличивать размер массива.

Я прочитал документацию на Class ArrayList и много статей в Интернете, но не нашел решения.

Я нашел сообщение здесь, но автор не рекомендует использовать его решение. "МАССИВ ИЗМЕНЯЕМОГО РАЗМЕРА"

Это часть моего кода:

//Implementation Class
package IncreaseArraySize;
public class StudentArrayList<E>{
    private Object[] elements;
    public StudentArrayList() {
            elements = new Object[]{null, null};
    }
        public StudentArrayList(int capacity) {
        elements = new Object[capacity];
        for(int i = 0; i < capacity; i++){
            elements[i] = null; 
        }
    }
    public void add(E e){
        Boolean isItAdded = false;
        for ( int i= 0; i < elements.length; i++) {
            //assuming the 1st null is the end of the list
                       if (elements[i] == null){  
                elements[i] = e;
                isItAdded = true;
                break;
            }
                        }
                        if (isItAdded == false){
                   int holdIndex = elements.length;
                   resizeArray(holdIndex+10);
                   elements[holdIndex] = e;
                }
                }
    private void resizeArray(int newCapacity){
        System.out.println("Resize the array 'elements' here");
    }
    public String toString(){
        String stringOfElements = "[";
        Boolean notFirstElement = false;
        for ( int i= 0; i < elements.length; i++) {
            if (elements[i] != null){
                if (notFirstElement) stringOfElements += ", ";
              stringOfElements += elements[i];
              notFirstElement = true;
            } 
        } 
        stringOfElements += "]";
        return stringOfElements;
    }
}

//Main method
package IncreaseArraySize;

public class testMyArrayList {
    public static void main(String[] args) {
        StudentArrayList<String> myArrayList = new StudentArrayList<String>(2);
        System.out.println("Initial list of elements = " + myArrayList.toString());
        myArrayList.add("this works fine");
        myArrayList.add("this works fine too");
        System.out.println("List of elements = " + myArrayList.toString());
        myArrayList.add("This doesn't work");
        System.out.println("Array was resized: list of elements= " + myArrayList.toString());
    }
}

Любая помощь приветствуется.

Идея состоит в том, чтобы создать новый массив большего размера и, используя цикл for или System.arraycopy(), скопировать значения, сохраненные в новый массив, а затем переназначить новый массив предыдущей переменной массива. Также обратите внимание, что ArrayList поддерживает переменную, такую ​​​​как размер/количество, поэтому вставка выполняется O (1), и для вставки не требуется итерация.

experiment unit 1998X 11.05.2023 09:09

Привет и добро пожаловать. Я предполагаю, что вы говорите о этом конкретном ответе. Когда они говорят, что это не рекомендуется, они имеют в виду реальный производственный код. Для домашнего задания вполне нормально. В любом случае, лучше было бы удвоить размер массива, когда он заполнен, а не увеличивать его на один элемент при каждой вставке.

Federico klez Culloca 11.05.2023 09:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете реализовать свой метод как

private void resizeArray(int newCapacity){
  Object[] newArray = new Object[newCapacity]; //create new extended array
  Object[] elements = this.elements; //get existing array
  System.arrayCopy(elements, 0, newArray, 0, elements.length); //copy existing data into the new array
  this.elements = newArray; // set new array as storage
}

Другие вопросы по теме