Test Foro de elhacker.net SMF 2.1

Programación => Programación General => Java => Mensaje iniciado por: rub'n en 5 Diciembre 2016, 19:04 PM

Título: getPromedioColumnas(), algun tip ?
Publicado por: rub'n en 5 Diciembre 2016, 19:04 PM
Ya puedo sacar el promedio de cada fila, pero de cada columna ? linea [75 a 85], tenia años sin hacer esto  :-X ,,,en la linea 38 llamo al metodo getPromedioFila y le paso un array, intente hacer algo parecido con la linea 51 de varias maneras pero me da java.lang.ArrayIndexOutOfBoundsException
Código (java) [Seleccionar]


import java.text.DecimalFormat;

/*
* @Array 2D como promediar cada columna ?
*/
public class Array2Dimensiones implements Mostrar {

private int array[][];
private int array2[][];
private DecimalFormat dosDigi = new DecimalFormat("0.00");

public Array2Dimensiones( String descripcion, int array[][], int array2[][] ) {
print("\""+descripcion+"\"\n");
this.array = array;
this.array2 = array2;
mostrarArray();
}

public void mostrarArray() {
print("Array 2D completo\n");
for( int tmp[] : array) {
for( int tmp2 : tmp ) {
print("{"+tmp2+"}");
}
print("\n");
}

/*
* PROMEDIO DE CADA FILA
*/
print("Promedio de cada fila \n");
for( int f=0; f<array.length; f++ ) {

for( int c=0; c<array.length; c++ ) {
print(""+array[f][c]);
}
double promedio = getPromedioFila( array[f] );
print("\t\t\t\t"+dosDigi.format(promedio)+"\n");
}

/*
* PROMEDIO DE CADA COLUMNA
*/
print("Promedio de cada columna \n");
for( int f=0; f<array.length; f++ ) {
double promedio = 0;

for( int c=0; c<array[f].length; c++ ) {
print(""+array[c][f]);
promedio = getPromedioColumna(array[c]);
}

print("\t\t\t\t"+dosDigi.format(promedio)+"\n");
}
}

/*
* PROMEDIO FILA
*/
public double getPromedioFila( int array[] ) {

int suma = 0;
for( int f=0; f<array.length; f++ ) {
suma += array[f];
}
return (double) suma / array.length;

}

/*
* PROMEDIO COLUMNA
*/
public double getPromedioColumna( int array[] ) {

int suma = 0;
for( int f=0; f<array.length; f++ ) {
for( int c=0; c<array[f]; c++ ) {
suma += array[c];
}
}
return (double) suma / array.length;

}

@Override
public void print( String s ) { System.out.print(s); }
public static void main( String []blablabl) {

int array[][] = {{1,2,3},
               {4,5,6},
                       {7,8,9}};

int array2[][] = {{1,2,3},
        {4},
{5,6,7}};

new Array2Dimensiones("2 tipos de Array 2d e Irregular",array,array2);

}
}


Código (java) [Seleccionar]
"2 tipos de Array 2d e Irregular"
Array 2D completo
{1}{2}{3}
{4}{5}{6}
{7}{8}{9}
Promedio de cada fila
123 2,00
456 5,00
789 8,00
Promedio de cada columna
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at Array2Dimensiones.getPromedioColumna(Array2Dimensiones.java:80)
at Array2Dimensiones.mostrarArray(Array2Dimensiones.java:52)
at Array2Dimensiones.<init>(Array2Dimensiones.java:18)
at Array2Dimensiones.main(Array2Dimensiones.java:99)

Título: Re: getPromedioColumnas(), algun tip ?
Publicado por: kingcreek en 7 Diciembre 2016, 19:25 PM
Te dejo lo que creo es la solucion si no entendi mal lo que quieres hacer, lo he ajustado para que sirva en array "regular" e "irregular".

Código (java) [Seleccionar]
import java.text.DecimalFormat;

/*
* @Array 2D como promediar cada columna ?
*/
public class Array2Dimensiones implements Mostrar {

private int array[][];
private int array2[][];
private DecimalFormat dosDigi = new DecimalFormat("0.00");

public Array2Dimensiones( String descripcion, int array[][], int array2[][] ) {
print("\""+descripcion+"\"\n");
this.array = array;
this.array2 = array2;
mostrarArray();
}

public void mostrarArray() {
print("Array 2D completo\n");
for( int tmp[] : array) {
for( int tmp2 : tmp ) {
print("{"+tmp2+"}");
}
print("\n");
}

/*
* PROMEDIO DE CADA FILA
*/
print("Promedio de cada fila \n");
for( int f=0; f<array.length; f++ ) {
    double promedio = 0;
    int c;
for( c=0; c<array[f].length; c++ ) {
print(""+array[f][c]);
promedio += array[f][c];
}
print("\t\t\t\t"+dosDigi.format(promedio / c)+"\n");
}

/*
* PROMEDIO DE CADA COLUMNA
*/

//obtenemos la longitud mas alta de las columnas para repetir el bucle for
int cantidad = 0;
int temp = 0;
int x, y;
        int[] segundo;
        for (x = 0; x < array.length; ++x) {
          segundo = array[x];
          for (y = 0; y < segundo.length; ++y) {
              temp++;
          }
          if(cantidad <= temp)
          {
              cantidad = temp;
              temp = 0;
          }
        }
       
print("Promedio de cada columna \n");

for( int f=0; f<cantidad; f++ ) {
double promedio = 0;
int count = 0;
int c;
for( c=0; c < array.length; c++ ) {
    //se filtran las posiciones del array con valor nulo
    if(array[c].length > f)
    {
    print(""+array[c][f]);
    promedio += array[c][f];
    count++;
    }
}
print("\t\t\t\t"+dosDigi.format(promedio / count)+"\n");
}

}


@Override
public void print( String s ) { System.out.print(s); }
public static void main( String []blablabl) {

int array[][] = {{1,2,3},
                {4,5,6},
                        {7,8,9}};

int array2[][] = {{1,2,3},
         {4},
{5,6,7}};

new Array2Dimensiones("2 tipos de Array 2d e Irregular",array,array2);

}
}