Назад | Начало урока | Вперед
Содержание

Глава 6

Задача 6.1 "Увеличивающиеся массивы."

Массивы имеют фиксированную длину, но мы можем заменить существующий массив большим, если его размер окажется недостаточным. Предположим объявлен массив A, имеющий определенную длину. После попытки добавить в него очередное значение возникла исключительная ситуация arrayOutOfBoundsException. Мы сможем вызвать метод grow, который создаст новый массив на 50% большим, скопирует все значения и вернет ссылку на новый массив. Напишите такой метод и протестируйте его в небольшой программе.

Решение

Метод grow() будет следующим:

int[] grow(int mass[], int mass2[], int length){

int len = length;
len = (int)(len + len/2);
mass2 = new int[len];

for(int i=0;i < length;i++){

mass2[i]= mass[i];
}//end for
return mass2;
}

В параметр функции передается исходный массив mass, затем функция создает новый массив mass2, на 50% больше исходного, копирует в него все данные из исходного массива и возвращает ссылку на новый массив mass2.
length - длина исходного массива, который требуется увеличить.

Еще в программе присутствует следующая инструкция:

mass = mass2;

Зта инструкция означает, что mass теперь указывает на место в памяти, где расположен массив mass2, то есть mass указывает на массив mass2. Теперь оператор mass.length вернет значение, равное длине массива mass2.

Код программы:


import java.text.*;
import javagently.*;
import java.util.*;
import java.io.*;

class MassModify {

MassModify () throws IOException {
int max = 100;
int cur = 20;
int cur1 = 0;
int mass[] = new int[cur];
int mass2[] = new int[cur];

for(int i=0;i < mass.length;i++){

mass[i]=i;
}

do{

try{
for(int i=cur1; ;i++){
mass2[i]=random_01(1,200);
}
}
catch (ArrayIndexOutOfBoundsException e){
System.out.println(" \n\n ArrayIndexOut " );
mass2 = grow(mass, mass2, cur);
}

for(int i=0;i < mass2.length;i++){

System.out.print(" *" + mass2[i]);
if(i%10==0)
System.out.print("\n");
}

cur = mass2.length;
cur1 = mass.length;
mass = mass2;
}
while(cur < max);
}
public static void main(String[] args) throws IOException {
new MassModify() ;
}

int[] grow(int mass[], int mass2[], int length){

int len = length;
len = (int)(len + len/2);
mass2 = new int[len];

for(int i=0;i < length;i++){

mass2[i]= mass[i];
}//end for
return mass2;
}

int random_01 (int min, int max ){

int z =0;
while(z < min ){
z = (int) (Math.random()* max);
}
return z;
}
}


Результат :

Подсказка

Анализируя результат мы видим, что при каждом возникновении исключительной ситуации в блоке catch программа увеличивает массив на 50%.


Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz