Podemos ter métodos que criam um array e o devolvem como resultado, ou seja, funções cujo retorno é de tipo array.
Vamos ilustrar esta situação com um método que cria e devolve um array de inteiros aleatórios entre zero e um dado valor.
Precisamos que quem invoque o método defina o número de elementos que o array deverá ter, além do valor máximo para os aleatórios, por isso o método terá dois parâmetros do tipo int
.
/**
* Constroi e devolve um vetor de valores aleatorios
* entre zero e um dado valor
* @param n - Quantos elementos deverah ter o array
* @param max - Valor maximo para os aleatorios
* @return Um vetor de n valores aleatorios em [0,max]
* @requires n > 0
*/
static int[] vetorDeAleatorios (int n, int max) {
int[] vetor = new int[n];
Random gerador = new Random();
for (int i = 0 ; i < n ; i++){
vetor[i] = gerador.nextInt(max + 1);
}
return vetor;
}
O seguinte programa invoca o método acima para obter um array de 7 números aleatórios no intervalo [0,10] e de seguida imprime os seus valores no standard output:
xxxxxxxxxx
import java.util.Random;
public class Aleatorios {
public static void main (String [] args) {
int[] aleatorios = vetorDeAleatorios(7, 10);
for (int i = 0 ; i < 7 ; i++){
System.out.println(aleatorios[i]);
}
}
/**
* Constroi e devolve um vetor de valores aleatorios
* entre zero e um dado valor
* @param n - Quantos elementos deverah ter o array
* @param max - Valor maximo para os aleatorios
* @return Um vetor de n valores aleatorios em [0,max]
* @requires n > 0
*/
static int[] vetorDeAleatorios (int n, int max) {
int[] vetor = new int[n];
Random gerador = new Random();
for (int i = 0 ; i < n ; i++){
vetor[i] = gerador.nextInt(max + 1);
}
return vetor;
}
}
Imagine o estado da memória no momento em que o método termina a sua execução e vai retornar o resultado. Como o valor a retornar é do tipo array, o que é retornado é uma referência ao array que foi criado no método:
Esse valor é de seguida atribuído à variável aleatórios
, que é local ao main
. De seguida essa variável é usada no ciclo que escreve no ecrã os vários elementos do array.
Se quiséssemos que o método usasse um gerador de aleatórios específico, em vez de criar um de cada vez que é executado, bastaria acrescentar um terceiro parâmetro, do tipo Random
.
xxxxxxxxxx
/**
* Constroi e devolve um vetor de valores aleatorios
* entre zero e um dado valor
* @param n - Quantos elementos deverah ter o array
* @param max - Valor maximo para os aleatorios
* @param gerador – Gerador de aleatorios
* @return Um vetor de n valores aleatorios em [0,max]
* @requires n > 0
*/
static int[] vetorDeAleatorios (int n, int max, Random gerador) {
int[] vetor = new int[n];
for (int i = 0 ; i < n ; i++){
vetor[i] = gerador.nextInt(max + 1);
}
return vetor;
}
Repare na diferença, em relação ao programa anterior, do estado da memória no momento em que o método termina a sua execução e vai retornar o resultado: a instância de java.util.Random
que é usada no método é a mesma que foi criada no main
, cuja referência foi guardada na variável meuGerador
, local ao main
; esta referência foi depois copiada para o parâmetro gerador
do método vetorDeAleatorios
, ficando o objeto a ser referenciado por essas duas variáveis.
Anterior: 9.4. Copiar arrays
Seguinte: 9.6. Métodos com parâmetros do tipo array