import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.TreeMap;
import java.util.stream.Collectors;
public class Parcial {
/**
* Si se está desarrollando se debe setear en true, de otro modo (para el
* usuario final) false
*/
public static final boolean DEBUG = true;
public static Usuario[] getUsuarios() {
return new Usuario[]{new Usuario(12, 4, "Billy"),
new Usuario(12, 1, "Vero"),
new Usuario(11, 2, "Alvaro"),
new Usuario(2, 3, "Kai"),
new Usuario(15, 4, "Hansel")};
}
public static void main(String[] args) throws IOException {
Usuario[] usuarios;
if (DEBUG) {
usuarios = getUsuarios();
} else {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Introduce la cantidad de usuarios: ");
int n = Integer.parseInt(br.readLine());
usuarios = new Usuario[n];
System.out.println("Ahora introduce los datos de los suaurios");
double facturado;
int estrato;
String nombre;
for (int i = 0; i < usuarios.length; i++) {
System.out.println("Usuario #" + (i + 1));
System.out.print("Nombre: ");
nombre = br.readLine();
System.out.print("Facturado: ");
facturado = Double.parseDouble(br.readLine());
System.out.print("Estrato: ");
estrato = Integer.parseInt(br.readLine());
usuarios[i] = new Usuario(facturado, estrato, nombre);
}
}
TreeMap<Integer, Double> facturadoEstrato = new TreeMap();
TreeMap<Integer, Double> usuariosEstrato = new TreeMap();
for (Usuario u : usuarios) {
facturadoEstrato.put(u.getEstrato(), facturadoEstrato.get(u.getEstrato()) == null ? u.getFacturado() : (facturadoEstrato.get(u.getEstrato()) + u.getFacturado()));
usuariosEstrato.put(u.getEstrato(), usuariosEstrato.get(u.getEstrato()) == null ? 1.0 : (usuariosEstrato.get(u.getEstrato()) + 1.0));
}
System.out.println("A continuación el total facturado por por estrato");
facturadoEstrato.forEach((e, f) -> {
System.out.println(e + ": " + f);
});
System.out.println("Total facturado: " + facturadoEstrato.values().stream().mapToDouble(Double::doubleValue).sum());
System.out.println("Usuarios de estrato 2 que pagan mas 55000: " + Arrays.asList(usuarios).stream().filter(u -> u.getEstrato() == 2 && u.getFacturado() > 55000).count());
System.out.println("Porcentaje de usuarios por estratos");
usuariosEstrato.forEach((e, f) -> {
System.out.println(e + ": " + f / usuarios.length * 100);
});
List<Usuario> listaOrdenados = Arrays.asList(usuarios)
.stream()
.sorted(Comparator.comparingDouble(Usuario::getFacturado).reversed())
.collect(Collectors.toList());
System.out.println("A continuación las facturas mas altas...");
if (listaOrdenados.size() < 5) {
listaOrdenados.forEach(System.out::println);
} else {
listaOrdenados.subList(0, 4).forEach(System.out::println);
}
}
}
class Usuario {
private double facturado;
private int estrato;
private String nombre;
public Usuario(double facturado, int estrato, String nombre) {
this.facturado = facturado;
this.estrato = estrato;
this.nombre = nombre;
}
@Override
public String toString() {
return "Nombre: " + nombre
+ "\nFacturado: " + facturado
+ "\nEstrato: " + estrato + "\n";
}
/**
* @return the facturado
*/
public double getFacturado() {
return facturado;
}
/**
* @param facturado the facturado to set
*/
public void setFacturado(double facturado) {
this.facturado = facturado;
}
/**
* @return the estrato
*/
public int getEstrato() {
return estrato;
}
/**
* @param estrato the estrato to set
*/
public void setEstrato(int estrato) {
this.estrato = estrato;
}
/**
* @return the nombre
*/
public String getNombre() {
return nombre;
}
/**
* @param nombre the nombre to set
*/
public void setNombre(String nombre) {
this.nombre = nombre;
}
}