Д.з.№5 Полезный класс: вектор

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

1. Необходимые public-методы:

  • конструктор по умолчанию;
  • конструктор с параметрами №1: Vector(int capacity);
  • конструктор с параметрами №2: Vector(double[] arr);
  • int getSize();
  • узнать значение элемента: double get(int pos);
  • установить значение элемента: void set(double val, int pos);
  • void insert(double val, int pos);
  • void erase(int pos);
  • удалить все элементы: void clear();
  • void print();

2. Реализовать метод clone, создающий и возвращающий копию данного объекта.

Технические подробности

  1. Описанную функциональность можно реализовать с помощью "классической" пары: динамического массива, выделенного "с запасом", и переменной size - сколько ячеек массива используется на данный момент.
  2. Конструктор по умолчанию создает пустой массив, но при этом резервирует некоторое количество свободных ячеек для последующего заполнения.
  3. Конструктор с параметрами №1 позволяет указать изначальную "емкость" массива (при этом size=0).
  4. Конструктор с параметрами №2 позволяет создать Vector в виде копии уже существующего динамического массива.
  5. Метод print() распечатывает все элементы массива в строку через пробел. В конце строки - "Enter". Если вектор пуст - распечатывается строка "Empty".
  6. Ошибочные ситуации (отрицательные размеры массива, индексы вне допустимого диапазона и т.п.) отлавливать при помощи assert.
  7. При этом допустимыми для обращения и удаления являются индексы от 0 до size-1, для вставки - от 0 до size включительно.
  8. Когда массив "дорастает" до своей текущей capacity, перевыделение памяти должно осуществляться "с запасом" (не на один элемент) - чтобы избежать серьезных проблем с производительностью.
  9. Метод clear() вовсе не обязательно должен что-либо физически уничтожать: необходимо и достаточно, чтобы после его вызова Ваш вектор вел себя как пустой: выдавал нулевой size, распечатывался как "Empty" и др.

Примеры

Вход
Выход
Vector v = new Vector();
v.print();

v.insert(88, 0);
v.insert(99, 1);
v.print();
System.out.println(v.getSize());

v.set(-2, 0);
System.out.println(v.get(0));

v.erase(0);
System.out.println(v.getSize());
System.out.println(v.get(0));
Empty
88.0 99.0
2
-2.0
1
99.0
Vector v1 = new Vector();
v1.print();

Vector v2 = new Vector(10);
v2.print();

double[] arr = {1, 2, 3, 4, 5};
Vector v3 = new Vector(arr);
v3.print();
Empty
Empty
1.0 2.0 3.0 4.0 5.0
Vector v = new Vector(10);

for(int i=0; i<11; i++)
    v.insert(i+1, i);

v.print();
System.out.println(v.getSize());
1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0
11

Контрольные вопросы

  • Приведите фрагмент кода для удаления элемента из произвольной позиции в массиве.
  • Функцию add() из следующего фрагмента вызвали 10 раз. Какие действия необходимо совершить, чтобы эту функцию можно было вызвать еще разок? (существующий код не менять!)
    Код:
    int[] arr = new int[10];
    int size = 0;
    void add(int val){
        arr[size] = val;
        size++;
    }
    
  • Проиллюстрировать на отдельном примере кода механизм «перевыделения» памяти, реализованный в методе insert() Вашего класса Vector.
  • Напишите (приблизительно) код конструктора Вашего класса Vector с параметром-массивом (Vector(double[] arr)) и поясните его действия.
  • Привести фрагмент кода, который заполняет объект класса Vector числами от 1 до 10.
Скачать Vector_Tests.java
Comments