Назад
Вперед
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 выводит эти
координаты на консоль.
Назад Вперед |