Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых
[Назад]

Библиотека примеров приложений Java

Оглавление
Базовые типы

Замещающие типы
Без указателей
Массивы
Структурное программи-
рование

Обработка исключений
Возбуждение исключений
Классы обработки исключений
Блок finally
Строки String
Класс Math
Класс Vector
Класс Stack
Словарь на базе Hashtable
Словарь на базе Properties
Цифровые часы
Собственный класс
Наследование классов

Интерфейсы

Назад Вперед

1.12. Использование класса Vector

В примере демонстрируются некоторые приемы работы с объектами класса Vector, предназначенного для создания массивов переменного размера.

Исходный текст примера

Архив проекта для Java WorkShop 2.0

Немного теории

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

Для организации массива с динамически изменяющимся размером вы можете воспользоваться классом java.util.Vector. Такой массив может хранить объекты любого класса.

При создании объекта класса Vector размер соответствующего массива можно не указывать. В этом случае будет создан массив с размером, принятом по умолчанию. Когда вы будете добавлять в него новые элементы, размер массива при необходимости будет автоматически увеличиваться.

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

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

Описание примера

В нашем примере мы создаем массив vPoints как объект класса Vector, предназначенный для хранения объектов класса MyPoint. Класс MyPoint предназначен для работы с точками, представленными своими координатами.

Массив vPoints создается следующим образом:

Vector vPoints = new Vector();

Далее программа запрашивает у пользователя начальный размер массива:

String szStr;
byte bKbd[] = new byte[256];
StringTokenizer st;
int i, j = 0;
    
System.out.println(
  "Enter initial number of elements:"); 
    
try
{
  int iCnt = System.in.read(bKbd);
  szStr = new String(bKbd, 0, iCnt);
      
  st = new StringTokenizer(szStr, "\r\n");
  szStr = 
    new String((String)st.nextElement());
      
  Integer intVal = new Integer(szStr);
  j = intVal.intValue();
}  
catch(Exception ex)
{
  System.out.println(ex.toString()); 
}

Здесь мы читаем строку символов из стандартного потока ввода методом System.in.read, удаляем из нее символы возврата каретки и перевода строки, а затем создаем объект класса Integer, передавая введенную и обработанную строку конструктору. Далее методом intValue мы преобразуем число к типу int и записываем его в переменную j.

На следующем шаге мы добавляем j элементов в массив:

for(i = 0; i < j; i++)
{
  vPoints.addElement(new MyPoint(i, i + 10));
}

Для добавления применяется метод addElement, определенный в классе Vector. В качестве параметра мы передаем этому методу ссылку на объект класса MyPoint, созданный с помощью оператора new.

В качестве координаты точки по оси X мы указываем конструктору класса MyPoint номер элемента массива, а в качестве координаты по оси Y - тот же номер, увеличенный на 10.

В следующем фрагменте кода мы демонстрируем использование методов insertElementAt и setElementAt:

try
{
  vPoints.insertElementAt(
    new MyPoint(2000, 2000), 2);

  vPoints.setElementAt(
    new MyPoint(3000, 3000), 3);
}  
catch(Exception ex)
{
  System.out.println(ex.toString()); 
}

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

Если текущий размер массива меньше указанного номера ячейки, возникает исключение ArrayIndexOutOfBoundsException. Мы предусмотрели его обработку в блоке catch.

После заполнения массива программа выводит его содержимое на консоль.

Размер массива мы получаем с помощью метода size, определенного в классе Vector:

for(i = 0; i < vPoints.size(); i++)
{
  MyPoint mpt;
  mpt = (MyPoint)vPoints.elementAt(i);
  mpt.printPoint();
}

Для извлечения элемента из массива мы применяем метод elementAt, передавая ему номер извлекаемого элемента. Этот метод возвращает ссылку на извлеченный объект. Преобразовав ссылку к типу MyPoint, мы распечатываем координаты точки, вызывая для этого метод printPoint, определенный в классе MyPoint.

Вот что мы увидим на консоли, указав начальный размер массива, равный 10:

Enter initial number of elements:
10
Point: (0,10)
Point: (1,11)
Point: (2000,2000)
Point: (3000,3000)
Point: (3,13)
Point: (4,14)
Point: (5,15)
Point: (6,16)
Point: (7,17)
Point: (8,18)
Point: (9,19)

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

Реализация класса MyPoint достаточно проста:

class MyPoint
{
  private int m_x=0;
  private int m_y=0;
  
  MyPoint(int ix, int iy)
  {
    m_x = ix;
    m_y = iy;
  }
  
  public void setPoint(int ix, int iy)
  {
    m_x = ix;
    m_y = iy;
  }
  
  public void printPoint()
  {
    System.out.println("Point: (" 
      + m_x + "," + m_y + ")"); 
  }
}

В нем определен конструктор и два метода. Конструктор и метод setPoint позволяют указывать координаты точки. Метод printPoint выводит эти координаты на консоль.

Назад Вперед

[Назад]