Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

[Duda] Pregunta compareTo

Hola a todos, he estado experimentando problemas para implementar la interfaz de comparable ya que mi programa fue realizado de una forma distinta con unas clases definidas como tarjeta, producto y compras la cual funciona con el main en este caso lo dejo aca insertado el codigo, pasa y resulta que hasta las pruebas quitando la implementacion de la interfaz funciona bien, osea no organiza los productos por costo, pero a la hora de hacerlo al metodo @Override que me organiza la lista de compras no me asimila mi parametro Producto pero si otroProducto para realizar la comparacion de precio correspondiente, no he podido encontrar una solucion, espero que me puedan ayudar.

import java.util.*;

public class Compra implements Comparable<Producto>{
    //VARIABLES QUE SE DECLARAN PARA LA CLASE INCLUYE INSTANCIA DE TARJETA Y ARRAYLIST CON PRODUCTOS
    private ArrayList<Producto> listaCompra;
    private Tarjeta tarjeta;
    private double totalCompra;
    
    public Compra(){//CONSTRUCTOR DE LA CLASE COMPRA CON SU ESTADO INICIAL LISTA DE COMPRA TARJETA CON SALDO CERO Y TOTAL COMPRA CERO
        listaCompra =new ArrayList<Producto>();
        tarjeta=new Tarjeta(0);
        totalCompra=0;
    }
    //METODO MAIN QUE INICIA NUESTRO PROGRAMA
    public static void main(String[] args) {
            Scanner entradaOpcion=new Scanner(System.in);
            Compra compra=new Compra();//INSTANCIA NUEVA COMPRA LLAMANDO AL CONSTRUCTOR

            //INICIO DE NUESTRA INTERFAZ
            System.out.println("Bienvenido a nuestro sistema de ventas por favor ingrese el cupo de su tarjeta:");
            double saldo=entradaOpcion.nextDouble();
            entradaOpcion.nextLine();
            compra.tarjeta.setSaldo(saldo);  
            int opcion;

            if (compra.totalCompra<saldo) {//BUCLE QUE VERIFICA SALDO CON EL TOTAL DE LA COMPRA INICIAL
                do { //ESTRUCTURA DE CONTROL QUE VERIFICARA OPCIONES DE AGREGAR PRODUCTO O SALIR
                    System.out.println("Presiona 1. para agregar producto, 2. para salir.");
                    opcion=entradaOpcion.nextInt();
                    entradaOpcion.nextLine();
                    if (opcion==1) {
                        compra.agregarProducto(); //LLAMA METODO QUE AGREGA PRODUCTO
                        compra.tarjeta.getSaldo();//LLAMA METODO QUE VERIFICA SALDO DE LA TARJETA
                    }
                } while (opcion!=2);
                
                compra.muestraLista();//LLAMA METODO DE LISTADO DE COMPRA
                
            }    
    }//FIN MAIN
    

    //METODO AGREGAR PRODUCTO
    public void agregarProducto(){
            Scanner entradaProducto=new Scanner(System.in);
            System.out.println("Ingresa nombre del producto:");
            String nombreProducto=entradaProducto.nextLine();
            System.out.println("Ingresa precio del producto:");
            double precioProducto=entradaProducto.nextDouble();

            if (tarjeta.getSaldo()>=precioProducto) {
                Producto producto=new Producto(nombreProducto, precioProducto);
                listaCompra.add(producto);
                tarjeta.restaSaldo(precioProducto);
                totalCompra+=precioProducto;
                System.out.println("Compra realizada! su producto ha sido añadido a la lista de compra.");
            }
            else{
                System.out.println("Producto no pudo ser comprado por saldo insuficiente!");
            }          
        }

    //METODO QUE MUESTRA LISTA DE COMPRA
    public void muestraLista(){
        System.out.println("Lista de productos comprados:");
        Collections.sort((listaCompra);//  A CAUSA DEL PROBLEMA CON LA IMPLEMENTACION EL METODO NO HA SIDO RESUELTO
        for (Producto producto : listaCompra) {
            System.out.println("*******************************************");
            System.out.println("Producto: "+producto.getNombreProducto()+" con un valor de: $"+producto.getPrecioProducto());
        }
        System.out.println("El total de su compra fue de: $"+totalCompra);//MUESTRA TOTAL
        System.out.println("-----------------------------------------------");
        System.out.println("El saldo de su tarjeta es de: $"+tarjeta.getSaldo());//MUESTRA SALDO DE LA TARJETA
        System.out.println("*******************************************");
    }

    //METODO QUE ORGANIZA ARRAYLIST Y PROBLEMA EN CUESTION A LA HORA DE REESTRUCTURAR 
    @Override
    public int compareTo(Producto otroProducto) {
        return Double.compareTo(this.precioProducto,otroProducto.getPrecioProducto());
    }
}
1 respuesta

¡Hola Cristian, espero que estés bien!

Entiendo que estás teniendo problemas al implementar la interfaz Comparable en tu clase Compra, específicamente en el método compareTo. Parece que estás teniendo dificultades al comparar los productos por su precio.

El problema está en la implementación del método compareTo. En lugar de utilizar Double.compareTo, debes comparar directamente los precios de los productos. Aquí te dejo un ejemplo de cómo podrías implementar el método compareTo en tu clase Compra:

@Override
public int compareTo(Producto otroProducto) {
    if (this.precioProducto < otroProducto.getPrecioProducto()) {
        return -1;
    } else if (this.precioProducto > otroProducto.getPrecioProducto()) {
        return 1;
    }
    return 0;
}

Con esta implementación, estarás comparando los precios de los productos y podrás organizar tu lista de compras correctamente.

Espero que esta solución te ayude a resolver tu problema. ¡Buena suerte con tu programa!

Espero haber ayudado y buenos estudios!