У меня есть домашнее задание, чтобы имитировать структуру данных 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());
}
}
Любая помощь приветствуется.
Привет и добро пожаловать. Я предполагаю, что вы говорите о этом конкретном ответе. Когда они говорят, что это не рекомендуется, они имеют в виду реальный производственный код. Для домашнего задания вполне нормально. В любом случае, лучше было бы удвоить размер массива, когда он заполнен, а не увеличивать его на один элемент при каждой вставке.




Вы можете реализовать свой метод как
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
}
Идея состоит в том, чтобы создать новый массив большего размера и, используя цикл for или System.arraycopy(), скопировать значения, сохраненные в новый массив, а затем переназначить новый массив предыдущей переменной массива. Также обратите внимание, что ArrayList поддерживает переменную, такую как размер/количество, поэтому вставка выполняется O (1), и для вставки не требуется итерация.