Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
8
respuestas

Identificando los 5 mejores episodios (SOLUCIONADO).

Esta es mi salida cuando pruebo la aplicación usando la misma serie que la profesora, "Game of thrones":

Top 5 de los mejores episodios: DatosEpisodio[titulo=The Rains of Castamere, temporada=0, numeroDeEpisodio=9, evaluacion=9.9, fechaDeLanzamiento=2013-06-02] DatosEpisodio[titulo=Battle of the Bastards, temporada=0, numeroDeEpisodio=9, evaluacion=9.9, fechaDeLanzamiento=2016-06-19] DatosEpisodio[titulo=The Winds of Winter, temporada=0, numeroDeEpisodio=10, evaluacion=9.9, fechaDeLanzamiento=2016-06-26] DatosEpisodio[titulo=Hardhome, temporada=0, numeroDeEpisodio=8, evaluacion=9.8, fechaDeLanzamiento=2015-05-31] DatosEpisodio[titulo=Blackwater, temporada=0, numeroDeEpisodio=9, evaluacion=9.7, fechaDeLanzamiento=2012-05-27]

Como pueden ver, el resultado de los mejores episodios es el mismo que ella obtiene, pero, me devuelve "temporada=0".

¿A alguien más le ocurre?

No logro encontrar el problema. Ahora estoy poniendo varios "souts" a lo largo del programa como para identificar el error.

Iré informando de lo que pasa y si alguien me puede ayudar, estaré muy agradecida.

8 respuestas

¡Hola Mariana, espero que estés bien!

¿Podría compartir tu código por favor?

Entiendo que estás teniendo un problema al obtener el número de temporada al probar la aplicación con la serie "Game of Thrones". Parece que la temporada se está mostrando como "0" en lugar del número de temporada real.

Este problema puede estar relacionado con la forma en que estás manejando los datos de la serie y las temporadas en tu código.

Basándome en el contexto que proporcionaste, parece que estás trabajando con listas de temporadas y episodios, y estás utilizando streams para realizar operaciones con estos datos.

Es posible que al momento de crear la lista de datos de episodios, la información de la temporada no se esté asignando correctamente, lo que podría estar causando que se muestre como "0" en lugar del número de temporada real.

Para solucionar este problema, te recomendaría revisar la parte de tu código donde estás creando la lista de datos de episodios y asegurarte de que la información de la temporada se esté asignando correctamente.

Puedes verificar que estás obteniendo el número de temporada adecuado de cada episodio al momento de crear la lista.

Además, es posible que necesites ajustar la forma en que estás utilizando los streams y las operaciones de filtrado y ordenamiento para asegurarte de que estás obteniendo los resultados esperados.

Espero que esta información te sea útil para identificar y resolver el problema que estás experimentando. Si necesitas más ayuda con algún fragmento específico de tu código, no dudes en compartirlo para que pueda brindarte una orientación más detallada.

Espero haber ayudado y ¡buenos estudios!

Buenas tardes.

Por favor, podría compartir su código del record DatosEpisodio y también las líneas de código en donde calcula el top 5 de los mejores episodios.

Buenos días. El cálculo del top 5 lo hago en la clase Principal. Lo llené de "souts" y comentarios para tratar de identificar el problema. Quedó larguísimo, por lo tanto, comparto el link del repositorio:

https://github.com/Lady-Marianne/streamberry-spring/blob/main/src/main/java/com/aluracursos/streamberryspring/principal/Principal.java

Aquí está el código de DatosEpisodio:

package com.aluracursos.streamberryspring.models;

import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public record DatosEpisodio(
        @JsonAlias("Title") String titulo,
        @JsonAlias("Season") int temporada,
        @JsonAlias("Episode") int numeroDeEpisodio,
        @JsonAlias("imdbRating") String evaluacion,
        @JsonAlias("Released") String fechaDeLanzamiento
) {
}

A medida que fui avanzando con los videos de la instructora Génesys, fui intuyendo por dónde estaría el error. Mi método para mostrar el top 5 de mejores episodios toma sus datos del record "DatosEpisodio". Al avanzar en las clases, la instructora crea una clase llamada simplemente "Episodio" que contiene los datos de los episodios, con sus getters y setters. Intuí que los records dan algún tipo de problema, así que rehice la parte del top 5, esta vez tomando los datos de "Episodio". La hice bastante bien, tuve algunos pequeños errores que ChatGTP me ayudó a corregir, y al final obtuve el resultado deseado. Aquí el código:

        System.out.println("\nTop 5 de los mejores episodios:\n");
        episodios.stream()
                .filter(e -> e.getEvaluacion() > 0.0) 
                .sorted(Comparator.comparing(Episodio::getEvaluacion).reversed())
                .limit(5) // Limita a los primeros 5
                .map(e -> String.format("Título: %s, Evaluación: %.2f, Temporada: %d",
                        e.getTitulo().toUpperCase(),
                        e.getEvaluacion(),
                        e.getTemporada())) 
                .forEach(System.out::println); 
        System.out.println("\n");

Salida (serie: "Dark"):

Top 5 de los mejores episodios:

Título: DAS PARADIES, Evaluación: 9,60, Temporada: 3 Título: EIN UNENDLICHER KREIS, Evaluación: 9,50, Temporada: 2 Título: ENDEN UND ANFÄNGE, Evaluación: 9,40, Temporada: 2 Título: ZWISCHEN DER ZEIT, Evaluación: 9,40, Temporada: 3 Título: VOM SUCHEN UND FINDEN, Evaluación: 9,20, Temporada: 2

Aquí les dejo mi repositorio para quien quiera verlo: https://github.com/Lady-Marianne/streamberry-spring

Genial.

El record DatosEpisodio en este caso se usa para mapear los datos que se quiere recibir de la llamada a la API. Y la clase Episodio es la entidad que almacena el episodio en si.

Estas son las propiedades que se recibe de la llamada al API al consultar los datos de una temporada de una determinada serie.

{
  "Title": "Breaking Bad",
  "Season": "1",
  "totalSeasons": "5",
  "Episodes": [
    {
      "Title": "Pilot",
      "Released": "2008-01-20",
      "Episode": "1",
      "imdbRating": "9.0",
      "imdbID": "tt0959621"
    },

Los datos que se pueden mapear en el record DatosEpisodio son Title, Released, Episode, imdbRating y imdbID. Sin embargo, el record que definiste está de la siguiente manera:

@JsonIgnoreProperties(ignoreUnknown = true)
public record DatosEpisodio(
        @JsonAlias("Title") String titulo,
        @JsonAlias("Season") int temporada,
        @JsonAlias("Episode") int numeroDeEpisodio,
        @JsonAlias("imdbRating") String evaluacion,
        @JsonAlias("Released") String fechaDeLanzamiento
) {
}

// Esto se mapea al record DatosEpisodio
{
  "Title": "Pilot",
  "Released": "2008-01-20",
  "Episode": "1",
  "imdbRating": "9.0",
  "imdbID": "tt0959621"
}

La propiedad temporada no se mapeará por que no existe en los datos de la API. No lo he probado, pero tal vez esa sea la razón por la cual al imprimir una lista de tipo DatosEpisodio la temporada tiene un valor de 0 en todos los elementos.

Hola, Denis.

En realidad, el dato "temporada" sí existe en la API como "Season" y yo lo mapeo en mi record "DatosEpisodio", pero, por algún motivo, no lo toma correctamente y sólo puedo tomarlo de la clase "Episodio".

package com.aluracursos.streamberryspring.models;

import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public record DatosEpisodio(
        @JsonAlias("Title") String titulo,
        @JsonAlias("Season") int temporada,
        @JsonAlias("Episode") int numeroDeEpisodio,
        @JsonAlias("imdbRating") String evaluacion,
        @JsonAlias("Released") String fechaDeLanzamiento
) {
}
package com.aluracursos.streamberryspring.models;

import java.time.LocalDate;
import java.time.format.DateTimeParseException;

public class Episodio {
    private Integer temporada;
    private String titulo;
    private Integer numeroDeEpisodio;
    private Double evaluacion;
    private LocalDate fechaDeLanzamiento;

    public Episodio(int temporada, DatosEpisodio d) {
        this.temporada = temporada;
        this.titulo = d.titulo();
        this.numeroDeEpisodio = d.numeroDeEpisodio();
        try {
            this.evaluacion = Double.valueOf(d.evaluacion());

        } catch (NumberFormatException e) {
            this.evaluacion = 0.0;
        }

        try {
            this.fechaDeLanzamiento = LocalDate.parse(d.fechaDeLanzamiento());
        } catch (DateTimeParseException e) {
            this.fechaDeLanzamiento = null;
        }
    }

    public Integer getTemporada() {
        return temporada;
    }

    public void setTemporada(Integer temporada) {
        this.temporada = temporada;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public Integer getNumeroDeEpisodio() {
        return numeroDeEpisodio;
    }

    public void setNumeroDeEpisodio(Integer numeroDeEpisodio) {
        this.numeroDeEpisodio = numeroDeEpisodio;
    }

    public Double getEvaluacion() {
        return evaluacion;
    }

    public void setEvaluacion(Double evaluacion) {
        this.evaluacion = evaluacion;
    }

    public LocalDate getFechaDeLanzamiento() {
        return fechaDeLanzamiento;
    }

    public void setFechaDeLanzamiento(LocalDate fechaDeLanzamiento) {
        this.fechaDeLanzamiento = fechaDeLanzamiento;
    }

    @Override
    public String toString() {
        return
                "Temporada: " + temporada +
                ", Título: " + titulo + '\'' +
                ", Número de episodio: " + numeroDeEpisodio +
                ", Evaluación: " + evaluacion +
                ", Fecha de lanzamiento: " + fechaDeLanzamiento;
    }
}

Tomando como ejemplo esta url que devuelve todos los episodio de la temporada 1 de la serie Game of Thrones.

https://www.omdbapi.com/?t=game+of+thrones&season=1&apikey=<API_KEY>

https://github.com/Lady-Marianne/streamberry-spring/blob/17b49c8df2a8bd270706633a3c9aa442838e3042/src/main/java/com/aluracursos/streamberryspring/principal/Principal.java#L55 Aquí se realiza el mapeamiento de los datos que provienen de la API

var datosTemporada = conversor.obtenerDatos(json, DatosTemporada.class);

JSON

{
  "Title": "Game of Thrones",
  "Season": "1",
  "totalSeasons": "8",
  "Episodes": [
    {
      "Title": "Unaired Original Pilot",
      "Released": "N/A",
      "Episode": "0",
      "imdbRating": "N/A",
      "imdbID": "tt31321401"
    },
    ...
  ]
}

Nótese también que episodios en DatosTemporada es una lista de DatosEpisodio

public record DatosTemporada(
        @JsonAlias("Season") int temporada,
        @JsonAlias("Episodes") List<DatosEpisodio> episodios
) {
}

public record DatosEpisodio(
        @JsonAlias("Title") String titulo,
        @JsonAlias("Season") int temporada,
        @JsonAlias("Episode") int numeroDeEpisodio,
        @JsonAlias("imdbRating") String evaluacion,
        @JsonAlias("Released") String fechaDeLanzamiento
) {
}

Entonces, el json se mapeará de la siguiente manera:

{
  "Title": "Game of Thrones",
  "Season": "1", DatosTemporada -> @JsonAlias("Season") int temporada
  "totalSeasons": "8", 
  "Episodes": [ DatosTemporada -> @JsonAlias("Episodes") List<DatosEpisodio> episodios
    {
      "Title": "Unaired Original Pilot", DatosEpisodio -> @JsonAlias("Title") String titulo,
      "Released": "N/A", DatosEpisodio ->  @JsonAlias("Released") String fechaDeLanzamiento
      "Episode": "0", DatosEpisodio -> @JsonAlias("Episode") int numeroDeEpisodio,
      "imdbRating": "N/A", DatosEpisodio -> @JsonAlias("imdbRating") String evaluacion,
      "imdbID": "tt31321401"
    }
  ]
}

Esto no se mapeó: DatosEpisodio -> @JsonAlias("Season") int temporada, porque la propiedadSeason no existe en los elementos del arreglo(lista) Episodes en el JSON.

Lo que resulta en lo siguiente:

DatosTemporada[temporada=1,
    episodios=[
    DatosEpisodio[titulo=Unaired Original Pilot, fechaDeLanzamiento=N/A, numeroDeEpisodio=0, evaluacion=N/A],
    ...
    ]
]

Más o menos voy entendiendo lo que pasa. Lo voy a analizar.