Autor Tema: Java por qué contiene null inicialmente un arreglo de objetos Eliminar Cliente  (Leído 5018 veces)

Jarol Salazar

  • Sin experiencia
  • *
  • Mensajes: 6
  • Estudiante de Informática Empresarial.
    • Ver Perfil
Hola buenos días, estoy trabajando en un proyecto de clase y necesito ayuda con la creación del método "Eliminar Cliente", quisiera que me explicaran y ayudaran a hacer el método.

Estas son las clases que tengo.


Clase Persona

Código: [Seleccionar]
package objectos;

public class Persona {

    private String id;
    private String firstName;
    private String secondName;
    private String firstLastName;
    private String secondLastName;
    private String phoneNumber;
    private String adress;
    private String email;
    private String sex;

    /**
     * @return the id
     */
    public String getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(String id) {
        this.id = id;
    }

    /**
     * @return the firstName
     */
    public String getFirstName() {
        return firstName;
    }

    /**
     * @param firstName the firstName to set
     */
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    /**
     * @return the secondName
     */
    public String getSecondName() {
        return secondName;
    }

    /**
     * @param secondName the secondName to set
     */
    public void setSecondName(String secondName) {
        this.secondName = secondName;
    }

    /**
     * @return the firstLastName
     */
    public String getFirstLastName() {
        return firstLastName;
    }

    /**
     * @param firstLastName the firstLastName to set
     */
    public void setFirstLastName(String firstLastName) {
        this.firstLastName = firstLastName;
    }

    /**
     * @return the secondLastName
     */
    public String getSecondLastName() {
        return secondLastName;
    }

    /**
     * @param secondLastName the secondLastName to set
     */
    public void setSecondLastName(String secondLastName) {
        this.secondLastName = secondLastName;
    }

    /**
     * @return the phoneNumber
     */
    public String getPhoneNumber() {
        return phoneNumber;
    }

    /**
     * @param phoneNumber the phoneNumber to set
     */
    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    /**
     * @return the adress
     */
    public String getAdress() {
        return adress;
    }

    /**
     * @param adress the adress to set
     */
    public void setAdress(String adress) {
        this.adress = adress;
    }

    /**
     * @return the email
     */
    public String getEmail() {
        return email;
    }

    /**
     * @param email the email to set
     */
    public void setEmail(String email) {
        this.email = email;
    }

    /**
     * @return the sex
     */
    public String getSex() {
        return sex;
    }

    /**
     * @param sex the sex to set
     */
    public void setSex(String sex) {
        this.sex = sex;
    }

}


Clase Cliente

Código: [Seleccionar]
package objectos;

public class Cliente extends Persona {

    public static void remove(int i) {
    }

    private boolean credito;

    private int limiteCredito;

    private int plazo;

    private String accountNumber;

    /**
     * @return the credito
     */
    public boolean isCredito() {
        return credito;
    }

    /**
     * @param credito the credito to set
     */
    public void setCredito(boolean credito) {
        this.credito = credito;
    }

    /**
     * @return the limiteCredito
     */
    public int getLimiteCredito() {
        return limiteCredito;
    }

    /**
     * @param limiteCredito the limiteCredito to set
     */
    public void setLimiteCredito(int limiteCredito) {
        this.limiteCredito = limiteCredito;
    }

    /**
     * @return the plazo
     */
    public int getPlazo() {
        return plazo;
    }

    /**
     * @param plazo the plazo to set
     */
    public void setPlazo(int plazo) {
        this.plazo = plazo;
    }

    /**
     * @return the accountNumber
     */
    public String getAccountNumber() {
        return accountNumber;
    }

    /**
     * @param accountNumber the accountNumber to set
     */
    public void setAccountNumber(String accountNumber) {
        this.accountNumber = accountNumber;
    }

}

Añadiré el principal en la respuesta.
« Última modificación: 21 de Octubre 2020, 14:18 por Alex Rodríguez »

Jarol Salazar

  • Sin experiencia
  • *
  • Mensajes: 6
  • Estudiante de Informática Empresarial.
    • Ver Perfil
Re:Ayuda [Eliminar Cliente]
« Respuesta #1 en: 18 de Septiembre 2019, 17:33 »
Clase principal
Código: [Seleccionar]
package sisverduras;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.Scanner;
import objectos.Cliente;
import objectos.Producto;

public class Principal {

    static int usuario = 10;
    static Producto listaProductos[] = new Producto[10];
    static int k = 0;
    static Cliente ListaCliente[] = new Cliente[10];

    public static void main(String[] args) throws IOException {

        menu();

    }

    private static void imprimirProductos(Producto producto) {
        System.out.println("Codigo: " + producto.getCodigo());
        System.out.println("Nombre: " + producto.getNombre());
        System.out.println("Precio: " + producto.getPrecio());
    }

    private static void imprimirListaProductos() {
        for (int i = 0; i < k; i++) {
            System.out.println("Codigo: " + listaProductos[i].getCodigo());
            System.out.println("Nombre: " + listaProductos[i].getNombre());
            System.out.println("Precio: " + listaProductos[i].getPrecio());
            System.out.println("Categoría: " + listaProductos[i].getCategoria());
            System.out.println("Fecha Vencimiento: "
                    + listaProductos[i].getFechaVencimiento());
            System.out.println("......................");
        }
    }

    private static void menu() throws IOException {

        System.out.println("Bienvenido a la verduleria");
        System.out.println("");
        System.out.println("1. Módulo de Productos");
        System.out.println("2. Módulo de Clientes");
        System.out.println("3. Salir");
        System.out.println("");
        System.out.println("Ingrese una Opción");
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String lee = br.readLine();
        switch (lee) {

            case "1": {
                menuProductos();
                break;
            }
            case "2": {
                menuCliente();
            }

        }

    }

    private static void menuProductos() throws IOException {
        System.out.println("Módulo de Productos");
        System.out.println("\n1. Añadir Producto");
        System.out.println("2. Editar Producto");
        System.out.println("3. Eliminar Producto");
        System.out.println("4. Ver Lista de Productos");
        System.out.println("5. Regresar al Menú Principal");
        System.out.println("");
        System.out.println("Ingrese una opción");

        BufferedReader lector = new BufferedReader(new InputStreamReader(System.in));
        String lee = lector.readLine();

        switch (lee) {
            case "1": {
                listaProductos[k] = crearProducto();
                k++;
                menuProductos();
                break;
            }
            case "2": {
                BufferedReader ingresa = new BufferedReader(new InputStreamReader(System.in));
                System.out.println("Editar Producto");
                System.out.println("");
                System.out.println("Ingrese el código del producto:");
                Producto producto = buscarProducto(Integer.parseInt(ingresa.readLine()));
                if (producto != null) {
                    editarProducto(producto);
                } else {
                    System.out.println("El producto no ha sido encontrado");
                }

                menuProductos();
                break;
            }
            case "4": {
                imprimirListaProductos();
                menuProductos();
                break;
            }

            case "5": {
                menu();
                break;
            }
        }

    }

    private static Producto crearProducto() throws IOException {
        Producto nuevo = new Producto();
        BufferedReader lector = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Nombre: ");
        String nombre = lector.readLine();
        nuevo.setNombre(nombre);
        System.out.println("Precio: ");
        nuevo.setPrecio(Double.parseDouble(lector.readLine()));
        System.out.println("Código Producto: ");
        nuevo.setCodigo(Integer.parseInt(lector.readLine()));
        System.out.println("Fecha de Vencimiento: ");
        nuevo.setFechaVencimiento(new Date(lector.readLine()));
        System.out.println("Categoría: ");
        nuevo.setCategoria(lector.readLine());
        return nuevo;
    }

    private static Producto buscarProducto(int cod) {

        for (int i = 0; i < k; i++) {
            if (cod == listaProductos[i].getCodigo()) {
                Producto encontrado;
                encontrado = listaProductos[i];
                return encontrado;
            }
        }

        return null;
    }

    private static void editarProducto(Producto producto) {

        System.out.println("Que datos va a cambiar");

    }

    private static void menuCliente() throws IOException {
        System.out.println("Módulo de Clientes");
        System.out.println("\n1. Añadir Cliente");
        System.out.println("2. Editar Cliente");
        System.out.println("3. Eliminar Cliente");
        System.out.println("4. Ver lista de Clientes");
        System.out.println("5. Buscar cliente");
        System.out.println("6. Regresar al Menú Principal");
        System.out.println("");
        System.out.println("Ingrese una opción");
        BufferedReader lector = new BufferedReader(new InputStreamReader(System.in));
        String lee = lector.readLine();

        switch (lee) {
            case "1": {
                ListaCliente[k] = crearCliente();
                k++;
                menuCliente();
                break;
            }
            case "2": {
                editarCliente();

                menuCliente();
                break;
            }
            case "3": {
                System.out.println("Eliminar cliente");
                System.out.println("Elija el número de asociado");
                eliminarCliente();
                break;
            }
            case "4": {
                imprimirListaCliente();
                menuCliente();
                break;
            }
            case "5": {
                buscarCliente();
                break;
            }

            case "6": {
                break;
            }
            default: {
                System.out.println("Ingrese una opción que este en el menú");
                menuCliente();
                break;
            }
        }

    }

    private static Cliente crearCliente() throws IOException {
        Cliente nuevo = new Cliente();
        BufferedReader lector = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Primer nombre: ");
        String firstName = lector.readLine();
        nuevo.setFirstName(firstName);
        System.out.println("Segundo nombre: ");
        String secondName = lector.readLine();
        nuevo.setSecondName(secondName);
        System.out.println("Primer apellido: ");
        String firstLastName = lector.readLine();
        nuevo.setFirstLastName(firstLastName);
        System.out.println("Segundo apellido: ");
        String secondLastName = lector.readLine();
        nuevo.setSecondLastName(secondLastName);
        System.out.println("Número de cédula");
        String id = lector.readLine();
        nuevo.setId(id);
        System.out.println("Número de celular: ");
        String phoneNumber = lector.readLine();
        nuevo.setPhoneNumber(phoneNumber);
        System.out.println("Dirección: ");
        String adress = lector.readLine();
        nuevo.setAdress(adress);
        System.out.println("Correo electronico");
        String email = lector.readLine();
        nuevo.setEmail(email);
        System.out.println("Código de suscripción");
        String accountNumber = lector.readLine();
        nuevo.setAccountNumber(accountNumber);
        return nuevo;

    }

    private static void imprimirListaCliente() {
        for (int i = 0; i < k; i++) {
            System.out.println("**********************");
            System.out.println("** Cliente " + (i + 1));
            System.out.println("** Código de suscripción:" + ListaCliente[i].getAccountNumber());
            System.out.println("** Nombre: " + ListaCliente[i].getFirstName() + " " + ListaCliente[i].getSecondName()
                    + " " + ListaCliente[i].getFirstLastName() + " " + ListaCliente[i].getSecondLastName());
            System.out.println("** Número de telefono:" + ListaCliente[i].getPhoneNumber());
            System.out.println("** Dirección: " + ListaCliente[i].getAdress());
            System.out.println("** Dirección electronica: " + ListaCliente[i].getEmail());
            System.out.println("** Cédula: " + ListaCliente[i].getId());
            System.out.println("**********************");
        }

    }

    private static void eliminarCliente() throws IOException {

    }

    private static void editarCliente() throws IOException {
        BufferedReader lector = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Digite el número de cedula del cliente que desea editar");
        String clienteEditar = lector.readLine();
        for (int i = 0; i < ListaCliente.length; i++) {
            if (clienteEditar.equals(ListaCliente[i].getId())) {
                Cliente nuevo = new Cliente();
                System.out.println("Primer nombre: ");
                String firstName = lector.readLine();
                nuevo.setFirstName(firstName);
                System.out.println("Segundo nombre: ");
                String secondName = lector.readLine();
                nuevo.setSecondName(secondName);
                System.out.println("Primer apellido: ");
                String firstLastName = lector.readLine();
                nuevo.setFirstLastName(firstLastName);
                System.out.println("Segundo apellido: ");
                String secondLastName = lector.readLine();
                nuevo.setSecondLastName(secondLastName);
                System.out.println("Número de cédula");
                String id = lector.readLine();
                nuevo.setId(id);
                System.out.println("Número de celular: ");
                String phoneNumber = lector.readLine();
                nuevo.setPhoneNumber(phoneNumber);
                System.out.println("Dirección: ");
                String adress = lector.readLine();
                nuevo.setAdress(adress);
                System.out.println("Correo electronico");
                String email = lector.readLine();
                nuevo.setEmail(email);
                System.out.println("Código de suscripción");
                String accountNumber = lector.readLine();
                nuevo.setAccountNumber(accountNumber);
                ListaCliente[i] = nuevo;
                menuCliente();

            } else {
                System.out.println("El cliente no se ha encontrado");
            }
        }
    }

    private static void buscarCliente() throws IOException {
        BufferedReader lector = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Digite el número de cedula del cliente que desea buscar");
        String clienteEditar = lector.readLine();
        for (int i = 0; i < ListaCliente.length; i++) {
            if (clienteEditar.equals(ListaCliente[i].getId())) {
                System.out.println("**********************");
                System.out.println("** Cliente " + (i + 1));
                System.out.println("** Código de suscripción:" + ListaCliente[i].getAccountNumber());
                System.out.println("** Nombre: " + ListaCliente[i].getFirstName() + " " + ListaCliente[i].getSecondName()
                        + " " + ListaCliente[i].getFirstLastName() + " " + ListaCliente[i].getSecondLastName());
                System.out.println("** Número de telefono:" + ListaCliente[i].getPhoneNumber());
                System.out.println("** Dirección: " + ListaCliente[i].getAdress());
                System.out.println("** Dirección electronica: " + ListaCliente[i].getEmail());
                System.out.println("** Cédula: " + ListaCliente[i].getId());
                System.out.println("**********************");
                menuCliente();
            } else {
                System.out.println("El cliente no se ha encontrado");
            }
        }
    }

}

Jarol Salazar

  • Sin experiencia
  • *
  • Mensajes: 6
  • Estudiante de Informática Empresarial.
    • Ver Perfil
Re:Ayuda [Eliminar Cliente]
« Respuesta #2 en: 18 de Septiembre 2019, 17:35 »
Se que estoy combinando inglés y español y que no debería hacerlo, pero algunas partes se me complicaban entonces decidí dejar algunas en inglés (Las más sencillas) y otras en español (Las más "difíciles").
Solo me faltaría hacer el método [Eliminar Cliente] y no se me ocurre una idea de hacerlo, si me pudieran ayudar sería de gran ayuda!
Gracias de antemano!

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re:Ayuda [Eliminar Cliente]
« Respuesta #3 en: 19 de Septiembre 2019, 00:57 »
Hola.

¿Los objetos Cliente y Producto tienes que guardarlos obligatoriamente en arrays simples?
¿O puedes usar otras estructuras dinámicas como las clases Vector o ArrayList?

Lo digo porque los arrays simples son estructuras estáticas. Siempre tienen el mismo tamaño y en realidad no puedes borrar nada.
Tus arrays SIEMPRE van a tener 10 objetos Cliente y 10 objetos Producto. Puedes darles valor null y así simular que han sido borrados. Pero no es un borrado real y cuando quieras hacer un listado, tendrás que controlar que posiciones del array tienen valor null (han sido borrados) y cuáles no.

Con estructuras dinámicas te ahorrar estos problemas. Son muy parecidos a los array simples, pero no tienen un tamaño fijo. Crecen o decrecen según añades o borras elementos, no hay que simular borrados nulleando elementos.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Jarol Salazar

  • Sin experiencia
  • *
  • Mensajes: 6
  • Estudiante de Informática Empresarial.
    • Ver Perfil
Re:Ayuda [Eliminar Cliente]
« Respuesta #4 en: 19 de Septiembre 2019, 01:49 »
Apenas estoy aprendiendo a programar (Estoy en el curso "Programación I"), solo hemos utilizado estáticos, a lo que me refiero es que si por ejemplo llene el array (las 10 posiciones) y un cliente ya va a mi tienda "eliminar" ese cliente para poder añadir otro.
No sé si me estoy explicando de la manera correcta, lo siento en esa parte.

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re:Ayuda [Eliminar Cliente]
« Respuesta #5 en: 20 de Septiembre 2019, 23:14 »
Intento explicarte visualmente el problema.

Mira, este sería el array de Clientes nada más empezar el programa:

| null | null | null | null | null | null | null | null | null | null |

Son 10 posiciones que contienen objetos de la clase Cliente. Y como al principio estos objetos aún no han sido iniciados (todavía no has añadido Clientes) pues comienzan con valor null.

Para añadir Clientes hay que controlar en cual de las 10 posiciones (que van de 0 a 9) se va a registrar el nuevo Cliente. Para controlar esto, podemos usar una variable int que empiece con valor 0, ya que esa sería la primera posición disponible.
Citar
int pos = 0;

Bien, vamos a añadir el primer Cliente. Lo haremos donde nos diga la variable pos, es decir, en la posición 0.

Código: [Seleccionar]
clientes[pos] = new Cliente("Cliente_00");
| Cliente _00| null | null | null | null | null | null | null | null | null |

Al añadir un cliente, incrementamos la variable pos:
Código: [Seleccionar]
pos++;
Ahora pos tiene valor 1. De este modo, pos sirve para decirnos cuantos clientes tenemos registrados (ahora mismo solo 1) y también sirve para que el programa sepa en que posición ha de registrar el próximo cliente (en la posición 1 del array).

Guau, aparentemente usando esta lógica, todo es perfecto. Sigamos añadiendo Clientes, vamos a añadir tres clientes más...

| Cliente_00 | Cliente_01 | Cliente_02 | Cliente_03 | null | null | null | null | null | null |

Tras añadir tres clientes, ahora pos tendría valor 4. Es decir, tenemos 4 clientes y el próximo se ha de añadir en la posición 4.
Todo funciona de maravilla.

Pero ahora vamos a "borrar" un cliente.
Si nos piden borrar Cliente_03, no habrá problema. En su posición actual establecemos valor null y a la variable pos le restamos -1.
Para averiguar donde está el cliente llamado "CLiente_03", usamos un bucle


Código: [Seleccionar]
int buscar = 0;
for (int j = 0; j < clientes.length; j++) {
    if (clientes[j].getNombre().equals("Cliente_03"))
        buscar = j; //Si el nombre coincide, hemos encontrado la posición donde hay que borrar
}
clientes[buscar] = null;
pos--;

| Cliente_00 | Cliente_01 | Cliente_02 | null | null | null | null | null | null | null |

Todo queda guay. Variable pos ahora tiene valor 3, porque tenemos 3 Clientes y si añadimos un cliente,  ha de ir en la posición 3.
Sin problemas....

Volvamos al array con todos los clientes:
| Cliente_00 | Cliente_01 | Cliente_02 | Cliente_03 | null | null | null | null | null | null |
Recordamos, aquí pos tiene valor 4

¿Y si el cliente que quieren borrar es Cliente_01?
Bueno, hacemos como antes, ¿no? Buscamos su posición, ponemos valor null y restamos -1 a pos

| Cliente_00 | null | Cliente_02 | Cliente_03 | null | null | null | null | null | null |

Ahora pos tiene valor 3, porque tenemos tres clientes. Pero, aquí es donde viene el problema, si queremos insertar un nuevo cliente, pos dice que ha de ir en la posicion 3
Ouch..!!  :o

Eso no puede ser, en la posición 3 tenemos a Cliente_03. Si añadimos un nuevo cliente, debería entrar en la posición 1, donde tenemos el valor null del cliente anterior que hemos borrado.
O en todo caso en la posición 4 que está libre....

¿Ves el problema que conlleva usar arrays? Para hacer algo como añadir y "borrar" clientes, hay que buscar una fórmula para saber bien en que posiciones se puede grabar un nuevo cliente.

Usar una variable como estaba haciendo ahora para contar los clientes que se añaden y borran, puede servir, pero tiene el inconveniente de que si se borra un cliente que no es el último existente en el array, ya no sabrá indicarnos la posición correcta donde se ha de guardar.

Esto se puede solventar de distintas formas.
Una forma sería reordenar todos los elementos cada vez que nos pidan borrar un cliente, de forma que los elementos null siempre queden al final.
Así la variable que usemos para contar, siempre apuntará a la primera posición disponible

Otra forma sería no guiarnos por esta variable para añadir clientes, sino que antes de añadir buscamos en el array la primera posición que sea null, y ahí metemos al cliente.

Código: [Seleccionar]
for (int j = 0; j < clientes.length; j++) {
    if (clientes[j] == null)
        clientes[j] = new Cliente("Fulanito");
}

Esta forma es quizás más fácil, pero hay que contemplar la posibilidad de que pasa si ya no quedan posiciones null disponibles porque el array ya está lleno.
Para esto lo más fácil es de nuevo usar una variable contador como hacíamos al principio, solo que esta variable no la usaremos para decidir en que posiciones se guardan clientes.
Solo servirá para saber de formar rápida cuantos clientes tenemos en todo momento.
Porque si resulta que ya tenemos los 10 clientes, no vamos a perder el tiempo en buscar posiciones null, porque no las hay.

Código: [Seleccionar]
if (cuentaClientes == 10)
    System.out.println("No caben más clientes, hay que borrar para poder añadir otro cliente");
else {
    for (int j = 0; j < clientes.length; j++) {
        if (clientes[j] == null)
            clientes[j] = new Cliente("Fulanito");
    }
    cuentaClientes++;  //Aumenta porque hemos añadido nuevo Cliente
}


Perdón si la explicación es demasiado extensa. Espero que se haya entendido.

Intenta tú ahora escribir el código final según tu programa actual. Si no lo consigues, intentaremos ayudarte.
Un saludo.
« Última modificación: 21 de Septiembre 2019, 00:03 por Kabuto »
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".