Hacer una lista a partir de un arreglo en java

0 votos
preguntado por sakura (260 puntos) Ene 28, 2016 en Java
Hola!

Soy nueva en este foro y también la programacion con Java. No sé si en el titulo me explique bien pero se los pongo mas detallado.

Tengo que hacer un programa que solicite el nombre de 5 vendedores que venden 3 tipos de productos. Para esto declaré un arreglos multidimensional, creo que hasta aqui voy bien (de no ser así corrijanme por favor!)

Habiendo capturado estos datos, se tiene que hacer el calculo de que vendedor tiene mas ventas y en que producto. Pensaba mandar a llamar o acceder a los productos de cada vendedor en particular y sumarlos, lo mas obvio lo sé, pero con el arreglo no se me ocurre como hacerlo, por eso pensé en hacer una lista, o mandar llamar otro objeto pero hasta ahora nada me ha funcionado.

Les dejo lo que llevo hasta ahora.

<pre lang='java'>import java.io.*;

 class tablaproduc {
    InputStreamReader isr = new InputStreamReader (System.in);
      BufferedReader flujoE = new BufferedReader (isr);
String vend[] = new String [5];
int prod [][] = new int [5][3];
float totv []=new float[5];

int x, z;
float ventas=0;

public tablaproduc(){

for (x=0; x<5; x=x+1){
for (z=0; z<3; z=z+1){

    vend[x]="";
    prod[x][z]=0;
    totv[x]=0;
   }
}
}

public void burbuja(){
    String tempvend="";
    int tempprod=0, pasada=0;
    float temptotv;

    for (pasada=1;pasada<5; pasada=pasada+1){
       for (x=0; x<4; x=x+1){
       for (z=0; z<2; z=z+1){

               tempvend=vend[x];
               tempprod =prod[x][z];
               temptotv=totv[x];

               vend[x]=vend[x+1];
               prod[x][z]=prod[x][z+1];
               totv[x]=totv[x+1];

               vend[x+1]=tempvend;
               prod[x][z+1]=tempprod;
               totv[x+1]=temptotv;
              }
           }
    }

   }
public void muestra (){

      System.out.println("Datos de ventas:");
    for (x=0; x<5; x=x+1){
    for (z=0; z<3; z=z+1){
        System.out.println(vend[x]+"  "+prod[x][z]);
    System.out.println("t"+"El total de ventas es de:"+ventas);
    }
    }
}

public void calcula (){
    for (x=0; x<5; x=x+1){
    for (z=0; z<3; z=z+1){
      ventas=ventas+totv[x];
     }
}
}

public void captura (){

       for(x=0;x<5;x=x+1){
     for(z=0;z<3;z=z+1){

  try {

   System.out.println("Ingrese nombre de vendedor:");
   vend[x]=flujoE.readLine();
    System.out.println("Ingrese el producto:");
     prod[x][z]=Integer.parseInt(flujoE.readLine());
     totv[x]=(vend[x]);}
    catch(IOException e) {}
}
}
}
}

/**
 *
 * @author sakura
 */
public class proyecto {
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
     tablaproduc datos= new tablaproduc();
         datos.captura();
         datos.calcula();
         datos.muestra();
         datos.burbuja();

     // TODO code application logic here
    }
}
También ahi están mis intentos de hacer la suma, pero obviamente no salen.

De antemano gracias por cualquier ayuda que me puedan dar!


8 Respuestas

0 votos
respondido por sakura (260 puntos) Ene 28, 2016
Gracias a la ayuda de garusis, el programa ya me marca el total de ventas, y, aunque ya lo hacia, me marca tambien el articulo mas vendido.

Sigo teniendo problmas con el metodo para calcular el articulo menos vendido, y tambien con el objeto "calcular orden" para ver cuantas veces se vendio en total ese unico articulo. Y necesito ponerlo bien porque al final tambien tendré que agregar otro objeto para que me acomode los vendedores de mayor a menor segun sus ventas.

Y respecto a lo que dice Torres, tienes razon en eso que me dices pero como ya  mero es la fecha de entrega del proyecto prefiero que me corra primero este bien y ya luego vero si puedo mejorarlo aun mas.

Y Sí, solo pido dos datos para ingresar, y estoy de acuerdo en que quizas esten mal acomodados pero bueno...

Dejo mi codigo como va hasta ahora

import java.io.*;

 class tablaproduc {
    InputStreamReader isr = new InputStreamReader (System.in);
      BufferedReader flujoE = new BufferedReader (isr);
String vend[] = new String [5];
int prod[][] = new int [5][3];
float totv []=new float[5];
float mayor[] = new float[5];
float menor[]= new float[5];

int x, z;
float orden = 0;

public tablaproduc(){
for (x=0; x<5; x=x+1){
vend[x]="";

for (z=0; z<3; z=z+1){
prod[x][z]=0;
}

totv[x]=0;
mayor[x]=0;
menor[x]=0;
}
}

public void burbuja(){
    String tempvend="";
    int tempprod=0, pasada=0;
    float temptotv;
    float tempmenor;

    for (pasada=1;pasada<5; pasada=pasada+1){
       for (x=0; x<4; x=x+1){
       for (z=0; z<2; z=z+1){

               tempvend=vend[x];
               tempprod =prod[x][z];
               temptotv=totv[x];
               tempmenor=menor[x];

               vend[x]=vend[x+1];
               prod[x][z]=prod[x][z+1];
               totv[x]=totv[x+1];
               menor[x]=menor[x+1];

               vend[x+1]=tempvend;
               prod[x][z+1]=tempprod;
               totv[x+1]=temptotv;
               menor[x+1]=tempmenor;

           }
           }

    }

   }

public void muestra (){

    System.out.println("Datos de ventas:");

    for (x=0; x<5; x=x+1){
    for (z=0; z<3; z=z+1){
    System.out.println(vend[x]+"  "+prod[x][z]);    

    }
    }
    for (x=0; x<5; x=x+1){
    System.out.println("n"+"El total de ventas de"+" "+vend[x]+" "+"es de"+"n"+totv[x]);
    System.out.println("t"+"Su producto mas vendido es:"+mayor[x]);
    System.out.println("t"+"El producto menos vendido es:"+menor[x]);

   }
for (x=0; x<5; x=x+1){
for (z=0; z<3; z=z+1){

 System.out.println("El producto"+" "+prod[x][z]+" "+"fue vendido un total de:"+" "+orden);
}
}

 }

public void calcularmayor(){

for (x=0; x<5; x=x+1){
for (z=0; z<3; z=z+1){
if(prod[x][z] > mayor[x]){
mayor[x] = prod[x][z];
}
}
}
}

public void calcularmenor(){

for (x=0; x<5; x=x+1){
for (z=0; z<3; z=z+1){
if(prod[x][z] < menor[x]){
menor[x] = prod[x][z];
}
}
}
}

public void calcularorden(){

int cantidad_numeros = 0;
for (x=0; x<5; x=x+1){
for (z=0; z<3; z=z+1){
orden += prod[x][z];
cantidad_numeros ++;
}
orden = (orden + cantidad_numeros);
}
}

public void captura (){

for(x=0;x<5;x=x+1){
try {
System.out.println("Ingrese nombre de vendedor:");
vend[x]=flujoE.readLine();
for(z=0;z<3;z=z+1){
System.out.println("Ingrese el producto:");
prod[x][z]=Integer.parseInt(flujoE.readLine());
totv[x]+=(float)(prod[x][z]);

}
}catch(IOException e) {}
}
}
}

/**
 *
 * @author sakura
 */
public class proyecto {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
     tablaproduc datos= new tablaproduc();
         datos.captura();
         datos.calcularmayor();
         datos.calcularmenor();
         datos.calcularorden();
         datos.muestra();
         datos.burbuja();

     // TODO code application logic here
    }

}
Gracias de nuevo!


0 votos
respondido por Torres (8,580 puntos) Ene 28, 2016
El código ponlo como Java para que ponga colores, etc.

Para calcular el menor no deberías inicializarlo a 0, sino a MAX_INT o al primer valor de la lista.

Estas comparando los valores de los productos vendidos con 0 y claro 0 siempre es menor y nunca actualiza


0 votos
respondido por garusis (340 puntos) Ene 28, 2016
Bueno... para empezar existe un error (que no afecta en nada a lo que estas haciendo pero que no debes cometer nunca) y es que, como estas haciendo un recorrido de una matriz, junto con un recorrido del vector, lo que vallas a hacer sobre el vector, debes ponerlo por fuera del for interno... osea:

tu tienes

for (x=0; x<5; x=x+1){
    for (z=0; z<3; z=z+1){

    vend[x]="";
    prod[x][z]=0;
    totv[x]=0;
    }
}

pero deberia ser:
for (x=0; x<5; x=x+1){
  vend[x]="";

    for (z=0; z<3; z=z+1){
    prod[x][z]=0;
    }

  totv[x]=0;
}
esto es por que de otra forma, cada vez que pases por cada celda de una fila de la matriz, vas a repetir la operacion... lo mismo ocurre en

 //deberia ser:

public void captura (){

  for(x=0;x<5;x=x+1){
     try {
         System.out.println("Ingrese nombre de vendedor:");
         vend[x]=flujoE.readLine();
           for(z=0;z<3;z=z+1){
             System.out.println("Ingrese el producto:");
             prod[x][z]=Integer.parseInt(flujoE.readLine());
             totv[x]=(vend[x]);
           }
         }catch(IOException e) {}
}
ahora... tienes un error grave en este ultimo y es que no puedes hacer esto:

totv[x]=(vend[x]);
esto es debido a que totv[x] es un vector de int y vend[x] es un vector de String... por lo que esto te dara un error de compilacion... me gustaria que dijeras que hace este metodo, para ayudarte a que me dijeses que pretendes hacer con este metodo para ayudarte a plantearlo...

el metodo calcular() esta haciendo el calculo total de todas las ventas de todos los vendedores y no el de cada uno por aparte, por lo que no te esta haciendo nada de lo que te pide el enunciado...

el metodo mostrar() si esta funcionando bien...

el metodo burbuja() esta sobrando totalmente ya que no esta haciendo nada util en el programa...

espero haberte sido de ayuda... y si tienes dudas, pregunta que con gusto respondere.


0 votos
respondido por Torres (8,580 puntos) Ene 28, 2016
Buenas,

Lo primero http://www.dudasprogramacion.com/topic/ayuda-foro-como-poner-codigo-fuente

Lo segundo, yo tiraría un poco de POO y me crearía una clase Vendedor y una clase Producto.

Vendedor: Id, Nombre, Apellidos, listaProductos

Producto: Id, Descripcion, unidadesVendidas

Cada Vendedor contendría un campo listaProductos con los productos que ha vendido.

Lo tercero, en tu código, cuales son los datos de entrada que se piden?

Nombre del Vendedor y luego? código del producto? unidades que se han vendido? entiendo que son las unidades que se han venido y que el tipo lo marca la posicion en el vector, pero como te aseguras de que se van a meter los datos en el orden correcto?

Lo cuarto, para el tema de arrays a listas http://download.oracle.com/javase/1.6/docs/api/java/util/Arrays.html#asList(java.lang.Object[])

Un saludo


0 votos
respondido por garusis (340 puntos) Ene 28, 2016
Woolaz!!... bueno, veo que has corregido muchas cosas y eso me alegra... bueno ahora veamos...

El constructor funciona perfectamente...

El metodo Captura() tambien funciona correctamente.

ahora... creo que no te has dado cuenta pero despues de llamar al metodo captura(), cada espacio del array totv[] guarda el total de ventas de cada vendedor... y el metodo calcula te esta sumando la cantidad de venta total de todos los vendedores... osea (totalvenderdor1+totalvendedor2+totalvendedor3...etc)... por ello es que el mensaje te lanza datos erroneos... asi que para empezar, debes borrar el metodo calcula() y cambiar en el metodo muestra()

System.out.println("n"+"El total de ventas de"+" "+vend[x]+" "+"es de"+"n"+ventas);
cambialo por

System.out.println("n"+"El total de ventas de"+" "+vend[x]+" "+"es de"+"n"+totv[x]);
ahora... existe un problema similar con los metodos calculaMayor() y calculaMenor()... veras el problema de todo esto, es que estas usando una misma variable para calcular diferentes cantidades... lo que va a provocar que en la variable "menor" quede solo el valor menor de las ventas del ultimo vendedor... y en la variable mayor quede solo el valor mayor de las ventas del ultimo vendedor... yo te recomendaria que cambiaras estas dos variables por 2 vectores.... menor[] y mayor[] y cambiaras los metodos calcular menor a algo asi:

public void calcularmenor(){
      for (x=0; x<5; x=x+1){
         for (z=0; z<3; z=z+1){
            if(prod[x][z] < menor){
               menor[x] = prod[x][z];
            }
         }
      }
 }
y para mostrar este valor, en el metodo muestra() cambias

System.out.println("t"+"El producto menos vendido es:"+menor);
por

System.out.println("t"+"El producto menos vendido es:"+menor[x]);
algo similar harias con el metodo calcularmayor() y su respectivo mensaje de muestra()


0 votos
respondido por sakura (260 puntos) Ene 28, 2016
Muchisimas gracias por esa ayuda!! Aunque se que en si no interfería con el funcionamiento del codigo, esa parte en especifico que se repetia una y otra vez me molestaba muchisimo y no sabia como cambiala! Tan sencillo, lo agradezco en verdad!

A partir de eso empecé a hacer lo que me faltaba. Empezando por cambiar el totv[x], sabía que estaba mal pero no estaba segura de que otro metodo poner para que se sumaran todas las ventas.  

En el codigo que pongo ahora ya hice todos los cambios que necesitaba para mostrar el total de ventas, el producto mas y menos vendido y cuantas veces se vendio ese producto, pero los resultados son erroneos. No sé si esté llamando mal los objetos o haya algo mal con mis operaciones (excepto la del producto mas vendido que es la unica que me da un resultado correcto hasta ahora).

Gracias de nuevo!

import java.io.*;

 class tablaproduc {
    InputStreamReader isr = new InputStreamReader (System.in);
      BufferedReader flujoE = new BufferedReader (isr);
String vend[] = new String [5];
int prod[][] = new int [5][3];
float totv []=new float[5];

int x, z;
float ventas=0, mayor=0, menor=0, orden = 0;

public tablaproduc(){
for (x=0; x<5; x=x+1){
vend[x]="";

for (z=0; z<3; z=z+1){
prod[x][z]=0;
}

totv[x]=0;
}
}

public void burbuja(){
    String tempvend="";
    int tempprod=0, pasada=0;
    float temptotv;

    for (pasada=1;pasada<5; pasada=pasada+1){
       for (x=0; x<4; x=x+1){
       for (z=0; z<2; z=z+1){

               tempvend=vend[x];
               tempprod =prod[x][z];
               temptotv=totv[x];

               vend[x]=vend[x+1];
               prod[x][z]=prod[x][z+1];
               totv[x]=totv[x+1];

               vend[x+1]=tempvend;
               prod[x][z+1]=tempprod;
               totv[x+1]=temptotv;

           }
           }

    }

   }

public void muestra (){

    System.out.println("Datos de ventas:");

    for (x=0; x<5; x=x+1){
    for (z=0; z<3; z=z+1){
    System.out.println(vend[x]+"  "+prod[x][z]);    

    }
    }
    for (x=0; x<5; x=x+1){
    System.out.println("n"+"El total de ventas de"+" "+vend[x]+" "+"es de"+"n"+ventas);
    System.out.println("t"+"Su producto mas vendido es:"+mayor);
    System.out.println("t"+"El producto menos vendido es:"+menor);

   }
for (x=0; x<5; x=x+1){
for (z=0; z<3; z=z+1){

 System.out.println("El producto"+" "+prod[x][z]+" "+"fue vendido un total de:"+" "+orden);
}
}

 }

public void calcula (){
    for (x=0; x<5; x=x+1){
    for (z=0; z<3; z=z+1){
      ventas=ventas+totv[x];

}
}
}

public void calcularmayor(){

for (x=0; x<5; x=x+1){
for (z=0; z<3; z=z+1){
if(prod[x][z] > mayor){
mayor = prod[x][z];
}
}
}
}

public void calcularmenor(){

for (x=0; x<5; x=x+1){
for (z=0; z<3; z=z+1){
if(prod[x][z] < menor){
menor = prod[x][z];
}
}
}
}

public void calcularorden(){

int cantidad_numeros = 0;
for (x=0; x<5; x=x+1){
for (z=0; z<3; z=z+1){
orden += prod[x][z];
cantidad_numeros ++;
}
orden = (orden + cantidad_numeros);
}
}

public void captura (){

for(x=0;x<5;x=x+1){
try {
System.out.println("Ingrese nombre de vendedor:");
vend[x]=flujoE.readLine();
for(z=0;z<3;z=z+1){
System.out.println("Ingrese el producto:");
prod[x][z]=Integer.parseInt(flujoE.readLine());
totv[x]+=(float)(prod[x][z]);
}
}catch(IOException e) {}
}
}
}

/**
 *
 * @author sakura
 */
public class proyecto {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
     tablaproduc datos= new tablaproduc();
         datos.captura();
         datos.calcula();
         datos.calcularmayor();
         datos.calcularmenor();
         datos.calcularorden();
         datos.muestra();
         datos.burbuja();

     // TODO code application logic here
    }

}
0 votos
respondido por Torres (8,580 puntos) Ene 28, 2016
Buenas,

Al no tener asociado de ninguna manera el vector de ventas con el de vendedores tendrás que ordenar los dos a la vez.

Utiliza http://download.oracle.com/javase/1.6/docs/api/java/util/Collections.html#sort(java.util.List) para que te sea mas fácil.

De todas maneras si lo que juzgan es el código, aparte de que funcione o no, ese código es bastante mejorable.

Aplicando algún concepto de POO como te comentaba mas arriba, ganarías mucho en limpieza y facilidad de desarrollo.

Un saludo


0 votos
respondido por sakura (260 puntos) Ene 28, 2016
Listo, ya calcula el mayor y el menor. Gracias  ;D

Para terminar, solo debo poner en orden a los vendedores de acuerdo al numero de sus ventas. Creo que para mas facil debi haber hecho una clase unicamente de los productos como me lo habian dicho antes, pero con lo tengo, creen que se pueda hacer algo?

Esto hasta ahora: (El objeto "vendedormas" era para tratar de calcular eso)

Código:

import java.io.*;

 class tablaproduc {
    InputStreamReader isr = new InputStreamReader (System.in);
      BufferedReader flujoE = new BufferedReader (isr);
String vend[] = new String [5];
int prod[][] = new int [5][3];
float totv []=new float[5];
float mayor[] = new float[5];
float menor[]= new float[5];
float prodt[] = new float [3];

int x, z;
float aux1=0;

public tablaproduc(){
for (x=0; x<5; x=x+1){
vend[x]="";

for (z=0; z<3; z=z+1){
prod[x][z]=0;
prodt[z]=0;
}

totv[x]=0;
mayor[x]=0;
menor[x]=x;

}
}

public void burbuja(){
    String tempvend="";
    int tempprod=0, pasada=0;
    float temptotv;
    float tempmenor;

    for (pasada=1;pasada<5; pasada=pasada+1){
       for (x=0; x<4; x=x+1){
       for (z=0; z<2; z=z+1){

               tempvend=vend[x];
               tempprod =prod[x][z];
               temptotv=totv[x];
               tempmenor=menor[x];

               vend[x]=vend[x+1];
               prod[x][z]=prod[x][z+1];
               totv[x]=totv[x+1];
               menor[x]=menor[x+1];

               vend[x+1]=tempvend;
               prod[x][z+1]=tempprod;
               totv[x+1]=temptotv;
               menor[x+1]=tempmenor;

           }
           }

    }

   }

public void muestra (){

    System.out.println("Datos de ventas:");

    for (x=0; x<5; x=x+1){
    for (z=0; z<3; z=z+1){
    System.out.println(vend[x]+"  "+prod[x][z]);    

    }
    }
    for (x=0; x<5; x=x+1){
    System.out.println("n"+"El total de ventas de"+" "+vend[x]+" "+"es de"+"n"+totv[x]);
    System.out.println("t"+"Su producto mas vendido es:"+mayor[x]);
    System.out.println("t"+"El producto menos vendido es:"+menor[x]);

   }
for (x=0; x<5; x=x+1){

 System.out.println("El producto"+" "+vend[x]+" "+"fue vendido un total de");

 }
  System.out.println("t"+"El orden de los vendedores, de acuerdo a sus ventas, es el siguiente:");

    for (x=0; x<5; x=x+1){
        System.out.println(vend[x]+totv[x]);

   }
 }

public void calcularmayor(){

for (x=0; x<5; x=x+1){
for (z=0; z<3; z=z+1){
if(prod[x][z] > mayor[x]){
mayor[x] = prod[x][z];
}
}
}
}

public void calcularmenor(){

for (x=0; x<5; x=x+1){
for (z=0; z<3; z=z+1){
if(prod[x][z] < menor[x]){
menor[x] = prod[x][z];
}
}
}
}

public void vendedormas(){

for (x=0; x<5; x=x+1){
for (z=0; z<3; z=z+1){
if (totv[x]<totv[z]){
aux1=totv[x];
totv[x]=totv[z];
totv[z]=aux1;
}
}
}
}

public void captura (){

for(x=0;x<5;x=x+1){
try {
System.out.println("Ingrese nombre de vendedor:");
vend[x]=flujoE.readLine();
for(z=0;z<3;z=z+1){
System.out.println("Ingrese el producto:");
prod[x][z]=Integer.parseInt(flujoE.readLine());
totv[x]+=(float)(prod[x][z]);

}
}catch(IOException e) {}
}
}
}

/**
 *
 * @author sakura
 */
public class proyecto {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
     tablaproduc datos= new tablaproduc();
         datos.captura();
         datos.calcularmayor();
         datos.calcularmenor();
         datos.muestra();
         datos.burbuja();

     // TODO code application logic here
    }

}

Preguntas relacionadas

0 votos
1 respuesta
0 votos
2 respuestas
0 votos
1 respuesta
preguntado por Whoviano (120 puntos) Ene 28, 2016 en Java
Bienvenido a Dudas de Programación, donde puedes hacer preguntas y recibir respuestas sobre los problemas más frecuentes de los lenguajes de programación, frameworks de desarrollo y bases de datos que utilices. Foro de Línea de Código
...