Implementación de Clases para Gestión de Tiempos y Clasificaciones de Ciclistas
Enviado por Programa Chuletas y clasificado en Informática y Telecomunicaciones
Escrito el en español con un tamaño de 6,12 KB
Clase TiempoImpl
Constructor:
Se proporciona un constructor con tres argumentos (horas, minutos y segundos). Los minutos y segundos deben estar entre 0 y 59, y las horas no deben ser negativas. En caso contrario, se lanza una IllegalArgumentException
.
public TiempoImpl(Integer h, Integer m, Integer s) {
if (h < 0 || m < 0 || m > 59 || s < 0 || s > 59)
throw new IllegalArgumentException("El valor de alguno de los argumentos es negativo o supera 59");
horas = h;
minutos = m;
segundos = s;
}
Método incrementa(Tiempo tiempo)
:
Este método incrementa el tiempo actual con otro tiempo pasado como argumento.
public void incrementa(Tiempo t) {
segundos = this.getSegundos() + t.getSegundos();
minutos = this.getMinutos() + t.getMinutos() + segundos / 60;
segundos = segundos % 60;
horas = this.getHoras() + t.getHoras() + minutos / 60;
minutos = minutos % 60;
}
Método compareTo(Tiempo t)
:
Compara dos objetos Tiempo
. Se considera que un objeto es menor que otro si sus horas, minutos o segundos son menores, respectivamente.
public int compareTo(Tiempo t) {
int r = 0;
r = getHoras().compareTo(t.getHoras());
if (r == 0) {
r = getMinutos().compareTo(t.getMinutos());
if (r == 0) {
r = getSegundos().compareTo(t.getSegundos());
}
}
return r;
}
Método toString()
:
Devuelve una representación textual del tiempo en formato "hh:mm:ss".
public String toString() {
String s = getHoras() + ":" + getMinutos() + ":" + getSegundos();
return s;
}
Clase ClasificacionImpl
Constructor:
Constructor sin argumentos que inicializa la estructura de datos.
public class ClasificacionImpl implements Clasificacion {
Map<Ciclista, Tiempo> tiempos;
public ClasificacionImpl() {
tiempos = new HashMap<>();
}
public Map<Ciclista, Tiempo> getTiempos() {
return tiempos;
}
}
Método agrega(Ciclista corredor, Tiempo tiempo)
:
Agrega el tiempo de un ciclista a la clasificación. Si el ciclista ya existe, se suman los tiempos; si no, se crea una nueva entrada.
public void agrega(Ciclista c, Tiempo tiempo) {
if (getTiempos().containsKey(c)) {
getTiempos().get(c).incrementa(tiempo);
} else {
getTiempos().put(c, tiempo);
}
}
Método porTiempos()
:
Devuelve una correspondencia ordenada (SortedMap
) donde las claves son los tiempos y los valores son listas de ciclistas con ese tiempo.
public SortedMap<Tiempo, List<Ciclista>> porTiempos() {
SortedMap<Tiempo, List<Ciclista>> res = new TreeMap<>();
Set<Ciclista> sp = tiempos.keySet();
for (Ciclista c : sp) {
Tiempo val = tiempos.get(c);
if (res.containsKey(val)) {
res.get(val).add(c);
} else {
List<Ciclista> lista = new LinkedList<>();
lista.add(c);
res.put(val, lista);
}
}
return res;
}
Método liderClasificacion()
:
Devuelve el líder de la clasificación (el ciclista con el menor tiempo). Se asume que no hay empates.
public Ciclista liderClasificacion() {
SortedMap<Tiempo, List<Ciclista>> m = porTiempos();
return m.get(m.firstKey()).get(0);
}
Método tiempoEquipo(String equipo)
:
Calcula el tiempo total de los ciclistas de un equipo dado.
public Tiempo tiempoEquipo(String equipo) {
Tiempo t = new TiempoImpl(0, 0, 0);
for (Ciclista c : getTiempos().keySet())
if (c.getEquipo().equals(equipo))
t.incrementa(getTiempos().get(c));
return t;
}
Método muestraClasificacion(String fichero)
:
Imprime la clasificación ordenada por tiempos en un fichero dado.
public void muestraClasificacion(String nomfich) {
Map<Tiempo, List<Ciclista>> map = porTiempos();
File file = new File(nomfich);
try {
PrintWriter pw = new PrintWriter(file);
for (Tiempo tiempo : map.keySet()) {
pw.println(tiempo);
for (Ciclista c : map.get(tiempo)) {
pw.println(c);
}
}
pw.close();
} catch (FileNotFoundException e) {
System.out.println("Fichero no encontrado " + nomfich);
}
}
Método nuevaClasificacion(String nomFich)
:
Crea una nueva clasificación a partir de un fichero de texto con los tiempos de una etapa, sumando los tiempos a la clasificación actual. Se asume que los ciclistas del fichero ya están en la clasificación anterior.
public Clasificacion nuevaClasificacion(String nomFich) {
Clasificacion nclas = new ClasificacionImpl();
try {
Scanner sc = new Scanner(new File(nomFich));
int cont = 0;
while (sc.hasNextLine()) {
String linea = sc.nextLine();
List<String> lisat = Utiles.separaElementos(linea);
if (lisat.size() != 6)
throw new IllegalArgumentException("linea " + cont + "Lectura de clasificación errónea " + lisat.size());
Tiempo t = new TiempoImpl(new Integer(lisat.get(3)), new Integer(lisat.get(4)), new Integer(lisat.get(5)));
Ciclista c = new CiclistaImpl(lisat.get(0), lisat.get(1), new Integer(lisat.get(2)));
Tiempo tant = this.getTiempos().get(c);
t.incrementa(tant);
nclas.agrega(c, t);
cont++;
}
sc.close();
} catch (FileNotFoundException e) {
System.out.println("Fichero no encontrado " + nomFich);
}
return nclas;
}