Удаление элемента в generic array
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(45);
numbers.add(78);
numbers.add(10);
numbers.add(17);
numbers.add(89);
numbers.add(16);
System.out.println(numbers);
numbers.removeAt(3);
System.out.println(numbers);
}
}
import java.util.Arrays;
public class ArrayList<T> {
private static final int DEFAULT_SIZE = 6;
private T[] elements;
private int size;
public ArrayList() {
this.elements = (T[])new Object[DEFAULT_SIZE];
this.size = 0;
}
/**
* Добавляет элемент в конец списка
* @param element добавляемый элемент
*/
public void add(T element) {
// если массив уже заполнен
if (isFullArray()) {
resize();
}
this.elements[size] = element;
size++;
}
private void resize() {
// запоминаем старый массив
T[] oldElements = this.elements;
// создаем новый массив, который в полтора раза больше предыдущего
this.elements = (T[])new Object[oldElements.length + oldElements.length / 2];
// копируем все элементы из старого массива в новый
for (int i = 0; i < size; i++) {
this.elements[i] = oldElements[i];
}
}
private boolean isFullArray() {
return size == elements.length;
}
/**
* Получить элемент по индексу
* @param index индекс искомого элемента
* @return элемент под заданным индексом
*/
public T get(int index) {
if (isCorrectIndex(index)) {
return elements[index];
} else {
return null;
}
}
private boolean isCorrectIndex(int index) {
return index >= 0 && index < size;
}
public void clear() {
this.size = 0;
}
public void removeAt(int index) {
elements.remove(elements[index]);
}
public String toString() { return Arrays.toString(elements); }
}
Ответы (2 шт):
Автор решения: Alex Rudenko
→ Ссылка
Массивы в Java никогда не имели метод remove равно как и add, так как у них всегда фиксированный размер, задаваемый при создании массива. Этот размер и возвращается полем .length.
При необходимости уменьшить размер массива при удалении элемента/нескольких элементов сперва надо декрементировать size, затем сдвинуть оставшиеся элементы влево (к началу массива) и, при достижении определённого порога (например size < length / 2), создавать массив меньшего размера, копируя в него оставшиеся элементы.
Автор решения: and73
→ Ссылка
Получился вот такой рабочий код
public void removeAt(int index) {
if (index < 0 || index > this.size) {
return;
}
T[] clippedElements = (T[])new Object[this.size - 1];
int clippedElementsIdx = 0;
for (int i = 0; i < size; i++) {
if (i != index) {
clippedElements[clippedElementsIdx++] = elements[i];
}
}
this.elements = clippedElements;
this.size--;
}
Всем спасибо!
