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;
}
}