Facturas aleatorias

Buen día, compañeros tengo la siguiente duda, espero explicarme bien :/

Tengo un programa que simula una compra, las clases que lo implementan son:

Cliente
Producto
Partida
Factura
Prueba

implementadas de la siguiente manera:

hasta ahí todo bien, implemente el código y funciona, pero ahora se me pide que genere 5 facturas con 5 clientes diferentes y productos diferentes así como la cantidad de productos comprada, esto de manera aleatoria.

empece por implementarlo de la siguiente manera en la clase prueba pero me he quedado atorado. Lo mas probable es que algun concepto de la POO este pasando por alto, gracias por su ayuda.

package venta;

import static java.lang.Math.random;
import java.util.ArrayList;

public class Prueba {
        public static void main(String [] args) {
               
                ArrayList<Cliente> clientes = new ArrayList<>();
               
                clientes.add(new Cliente("Juan", "Calle coral 120","Morelia","Michoacan","VIMJ910606U5","58010"));
                clientes.add(new Cliente("Jose", "Calle uruapan 481","Morelia","Michoacan","JJMJ810606U9","52010"));
                clientes.add(new Cliente("Alberto", "Calle solidaridad","DF","Mexico","AZKJ930608U5","57810"));
                clientes.add(new Cliente("Juan", "Calle coral 120","Morelia","Michoacan","VIMJ910606U5","58010"));
                clientes.add(new Cliente("Carlos", "Calle revolucion","Queretaro","Queretaro","VIUJ930806U7","35045"));
               
                ArrayList<Producto> productos = new ArrayList();
                productos.add(new Producto("Lavadora",18900));
                productos.add(new Producto("Licuadora",1200));
                productos.add(new Producto("Refigerador",12900));
                productos.add(new Producto("Extractor",1500));
                productos.add(new Producto("Lavadora",18900));
               
                ArrayList<Factura> facturas = new ArrayList();
                for (int i = 0; i < 5; i++) {
                    int num= (int) (random()*4+0);
                    //System.out.println(num);
                    facturas.add(new Factura(clientes.get(num)));
                }
               
                for (int i = 0; i < 5; i++) {
                    int num= (int) (random()*4+0);
                    //System.out.println(num);
                    facturas.get(i).agrega(productos.get(num), num);
                }
               
                for (Factura f: facturas) {
                    System.out.println(f);
                }
        }

}

y esto es lo que imprime:

run:
venta.Factura@1d4ab05
venta.Factura@127f4f9
venta.Factura@44331c
venta.Factura@1778d0c
venta.Factura@1cd1cea
BUILD SUCCESSFUL (total time: 0 seconds)

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de chicowed

Solucionado...

Ya vi el error, me falto poner en el println System.out.println(f.formato());

Imagen de chicowed

Validar Fecha

Buen día compañeros,
Tengo la siguiente inquietud, me he quedado un poco atascado.
Necesito hacer una clase Fecha, la cual su constructor protege de que se le pase una fecha inconsistente, empece haciendo lo siguiente:

import static java.lang.Math.random;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

/**
 *
 * @author Josue
 */

public class Fecha {
    private int dia;
    private int mes;
    private int anio;
   
    public Fecha() {
       
    }

    public Fecha(int dia, int mes, int anio) {
       
        if (this.mes==2 && ((this.anio%4==0) && ((anio % 100 != 0) || (anio % 400 == 0)))) {
            int num = (int) (random() * 29 + 1);
            this.dia = num;
        }
        this.dia = dia;
        this.mes = mes;
        this.anio = anio;
    }

    @Override
    public String toString() {
        LocalDate today = LocalDate.of(anio, mes, dia);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd 'de' MMMM 'de' yyyy");
        return formatter.format(today);
    }
}

En mi clase pricipal cuido que se le pasen dias, meses y años coherentes:

                int dia = (int) (random() * (31-1+1) + 1);
                int mes = (int) (random() * (12-1+1) + 1);
                int anio = (int) (random() * (2016-1900+1) + 1900);
                Fecha fechaNacimiento = new Fecha(dia,mes,anio);

Ahora lo que quiero es que en el constructor se verifique que es una fecha valida como en un principio dije, es necesario crear una Array de los meses que tienen 28, 29, 30 o 31 días? o de que manera lo podría analizar, gracias.

Imagen de Nopalin

y que es una fecha

y que es una fecha incosistente para tí?

Imagen de chicowed

Fecha

pues no solo para mi, creo que una fecha valida es una fecha que existe o no se como describirlo, pero por ejemplo el usuario no puede decir que nació el 35/13/1982 o si?

Este ejercicio es de una clase de POO, ya que en lo personal yo utilizaría el paquete java.time.

Pero bueno ya lo solucione, Gracias. después publico el código corregido porque el que puse esta mal.

Imagen de javatlacati

algunas pruebas unitarias para que te diviertas

Hola! te comparto algunas pruebas unitarias que puedes ajustar apra aplicarle a tu código.

import junit.framework.TestCase;

public class SimpleDateFormatterTest extends TestCase{
    public void testUno() {
        assertEquals("01/12/2016", SimpleDateFormatter.formatDate("1", "12", "2016"));
    }

    public void testDos() {
        assertEquals("04/02/2014", SimpleDateFormatter.formatDate("04", "2", "2014"));
    }

    public void testNumeric() {
        assertEquals(true, SimpleDateFormatter.formatDate("04", "2", "2014").substring(0, 2).matches("\\d\\d"));
        assertEquals(true, SimpleDateFormatter.formatDate("04", "2", "2014").substring(3, 5).matches("\\d\\d"));
        assertEquals(true, SimpleDateFormatter.formatDate("04", "2", "2014").substring(6, 8).matches("\\d\\d"));
    }
   
    public void testBisiest(){
        assertEquals(true, SimpleDateFormatter.formatDate("29", "2", "2016").substring(6, 8).matches("\\d\\d"));
    }
   
    public void testDayRange() {
        final int day=Integer.valueOf(SimpleDateFormatter.formatDate("04", "2", "2014").substring(0, 2));
        assertEquals(true, day < 32 && day >0);
    }
     public void testDayOutofRange() {
        assertEquals("Not a Date",SimpleDateFormatter.formatDate("32", "2", "2014"));
        assertEquals("Not a Date",SimpleDateFormatter.formatDate("31", "04", "2016"));
    }
    public void testMonthRange() {
        final int day=Integer.valueOf(SimpleDateFormatter.formatDate("04", "2", "2014").substring(3, 5));
        assertEquals(true, day < 12 && day >0);
    }
    public void testMonthOutOfRange() {
        assertEquals("Not a Date",SimpleDateFormatter.formatDate("02", "22", "2014"));
    }
     public void testNumericOne() {
       assertEquals("Not a Date", SimpleDateFormatter.formatDate("aa", "aa", "aaaa"));
       assertEquals("Not a Date", SimpleDateFormatter.formatDate("11", "aa", "aaaa"));
       assertEquals("Not a Date", SimpleDateFormatter.formatDate("11", "11", "aaaa"));
       assertEquals("Not a Date", SimpleDateFormatter.formatDate("11", "aa", "2016"));
    }
}

bytes!

Si, hacer un arreglo es lo

Si, hacer un arreglo es lo más fácil.

Algo como:

private static final int [] dem = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
public Fecha( int dia, int mes, int anio ) {
 
    if (   mes < 1
        || mes > 12
        || anio < 1
        || dia < 1
        || dia >  (mes == 2 && bisiesto(anio) ? 29 :  dem[mes-1] ))  {
            throw IllegalArgumentException( String.format("Fecha invalida: %d/%d/%d" ,dia, mes, anio ) );
   }
 
   this.dia = dia;
   this.mes = mes;
   this.anio = anio;
}

Por cierto es mejor usar

<code>
Random r = new Random();
r.nextInt( limiteSuperior );

Que usar Math.random() directamente