Использование векторов (Vector)Допустим перед нами лежит задача - во введенной пользователем строке, занести все слова в массив. Казалось, что может быть проще - создал массив, и записываешь в него все буквы, пока не встретится пробел. Но не тут то было. Ведь заведомо неизвестно, сколько будет слов в строке, а значит мы не знаем какой размерности создавать массив. Конечно можно исхитриться, и сначала подсчитать количество пробелов, а потом создать массив размерностью num_of_spaces + 1. Но это много лишнего и ненужного кода. Вот тут то на помощь нам и приходит вектор.
Вектор, это некий контейнер для любых объектов. От массива он отличается во-первых тем, что не имеет типа. То есть в него можно положить как числа, строки, так и классы или любые другие объекты. Вторым отличием является его безразмерность, то есть не нужно заранее указывать размер вектора.
Чтобы использовать вектор, нужно импортировать класс java.util.Vector;
После этого можно инициализировать вектор. Делается это также, как и в случае с классами:
Vector v = new Vector();
Всё. После этого можно использовать наш вектор в необходимых целях.
Чтобы добавить в него что-то, используем метод: v.addElement(Object o);
Чтобы извлечь, используем метод: v.elementAt(int num);
Но к нему я вернусь позже.
Итак, перед нами задача - положить слова из строки в массив.
public String[] getWords(String text) {
Vector v = new Vector();
String temp = "";//промежуточная строка, будет собирать слово
int len = text.length();
for(int i = 0; i < len; i++) {
int ch = text.charAt(i);//это наш символ в тексте
if((ch == ' ') && // если встретился пробел
(temp.length() > 0)) { //и в промежуточной строке есть слово
v.addElement(text);// то заносим его в вектор
temp = ""; // и делаем строку пустой
} else temp = temp + String.valueOf((char) ch); // если не пробел, то добавляем его к слову
}
// Добавляем последнее слово
if (temp.length() > 0) v.addElement(text);
/* Вот теперь в наш вектор
помещены все слова,
но, поскольку наша задача вывести массив,
то воспользуемся одной хорошей функцией */
int size = v.size();//мы знаем сколько элементов в векторе
String[] out = new String[size]; // значит без труда создаем массив
v.copyInto(out); // и перегоняем содержимое вектора в массив
// Теперь всё что остается это
return out;
}
Вот и всё. Здесь нет ничего сложного. Но один момент мы всё же не разобрали - как обстоят дела с получением объекта из вектора.
На секунду представим, что про метод copyInto мы ничего не знаем, поэтому переведем данные вручную:
for (int i = 0; i < size; i++) {
out[i] = (String) v.elementAt(i);
}
Объясню зачем нужно это "(String)". Всё дело в том, что метод elementAt(int) возвращает объект, а не тот тип, который был положен. Поэтому без преобразования здесь не обойтись. Если мы ложили Integer, то нужно получать его так: Integer d = (Integer) v.elementAt(i);
Более подробно о том или ином методе класса Vector, можно почитать в
доках __________________