una dudilla de matrices...

Helena
18 de Junio del 2006
buenas a [email protected]!
tengo un problemilla con un ejercicio...es sobre los meses y dias...el array seria...
int[][] lluvia= new int[MESES][DIAS];

y el caso esk kiero recorrer desde el 21 de marzo...desde int[2][20], hasta el 20 de junio....int[5][19]...

alguien me puede ayudar??????\\'
gracias y un saludo!!

Diego
18 de Junio del 2006
Yo una vez tuve que hacer una práctica similar, y mi consejo es que utilices un array en lugar de una matriz, que te facilitará las operaciones secuenciales, y emplees un array auxiliar que te indique en qué día empiezan los meses.
private static final short[] inicioMes={0,31,59,90,120,151,181,212,243,273,304,334,365};

private final double [] lluvia=new double[365];

public double getPrecipitaciones(int dia,int mes){
int diaAnual=convierte(dia,mes);
if(dia<0||diaAnual>=inicioMes[mes+1])
throw new IllegalArgumentException("Dia fuera del mes");
return lluvia[diaAnual];
}

public void setPrecipitaciones(int dia,int mes,double precipitaciones){
int diaAnual=convierte(dia,mes);
if(dia<0||diaAnual>=inicioMes[mes+1])
throw new IllegalArgumentException("Dia fuera del mes");
luvia[diaAnual]=precipitaciones;
}

public static int convierte(int dia,int mes){
inicioMes[mes]+dia;
}

Esta estructura te permite sobrecargar métodos para obtener información de forma fácil y sencilla:
// Precipitaciones anuales
public Iterator<Double>temperaturas(){
return temperaturas(0,lluvia.length);
}
// Precipitaciones de un mes
public Iterator<Double>temperaturas(int mes){
return temperaturas(inicioMes[mes],inicioMes[mes+1]);
}

// Precipitaciones entre un dia y otro
public Iterator<Double> temperaturas(int diaInicio,int diaFin){
return new Iterator<Double>(){
int i=diaInicio;

public boolean hasNext(){
return i<diaFin; //O <= si se desea incluir el último día
}

public Double next(){
!hasNext()
throw new NoSuchElementException();
return lluvia[i++];
}

public void remove(){
if(i==diaInicio)
throw new IllegalStateException();
lluvia[i-1]=0.0;
}
};
}

De este modo, para recorrer el rango de temperaturas, entre el 21 del 3 y el 20 del 6, sería:

for(double temperatura:temperaturas(convierte(21,3),convierte(20,6))){
//Operar con la temperatura.
}

Espero que te sirva.