Enunciado: Implementação em Java

Data de Publicação

08/03/2026

Data de Modificação

08/03/2026

Implementação em Java

Este documento descreve as tarefas a serem implementadas no paradigma Orientado a Objetos (Java).

Este é o Trabalho Prático 1 (TP1) da disciplina, sendo o mais robusto e com maior peso na avaliação.

Níveis de Dificuldade e Exigências

Diferente das implementações em Prolog e Lisp, que trabalham com bases de conhecimento fixas, a implementação em Java deve ser capaz de lidar com:

  • grande volume de dados
  • estrutura de dados eficientes
  • carga dinâmica de informações

Para acomodar diferentes níveis de experiência, o trabalho admite três níveis de implementação.

Nível 1 — Naive (Iniciante)

  • Uso de loops simples (for, while)
  • Uso de listas (ArrayList)
  • Leitura de CSV manual com String.split()

Este nível prioriza clareza de implementação.


Nível 2 — Profissional

Uso obrigatório de estruturas eficientes:

  • HashMap para indexação em \(\mathcal{O}(1)\)
  • HashSet para interseções e consultas rápidas
  • estruturação mais clara das coleções

Exemplos de indexação:

  • filmes por id
  • avaliações por usuario

Nível 3 — Avançado (Expert)

Uso intensivo de recursos modernos do Java:

  • Streams API
  • Lambdas
  • Collectors

Neste nível recomenda-se evitar loops explícitos (for) nas Fases 2 e 3, privilegiando pipelines funcionais.


Modelo de Dados e Entrada de Dados

Sua implementação será submetida em um Juiz Online Automático, semelhante aos utilizados em Maratonas de Programação.

ImportanteEntrada de Dados

Todos os dados devem ser lidos via Entrada Padrão (System.in) utilizando:

  • Scanner
  • ou BufferedReader

Você deverá implementar as seguintes classes de modelo:

  • Filme
  • Usuario
  • Avaliacao

Os dados seguirão exatamente a estrutura definida na especificação geral do problema.

O Juiz Online utilizará grandes volumes de dados para verificar:

  • eficiência do algoritmo
  • uso correto de estruturas \(\mathcal{O}(1)\)

Fase 1: Consultas

Assinaturas sugeridas (adapte para sua classe de Controle):

// Retorna filmes de um gênero
public List<Filme> filmesPorGenero(String genero);

// Retorna filmes após ano X
public List<Filme> filmesDeAnoSuperior(int ano);

Fase 2: Regras de Negócio

// Calcula média
public double mediaAvaliacoes(int uid);

// Retorna filmes que o usuário NÃO assistiu
public List<Filme> filmesNaoAvaliados(int uid);

// Determina se usuário é "Hater"
public boolean isUsuarioHater(int uid);

Fase 3: Sistema Colaborativo

O método principal do sistema.

public List<Filme> recomendar(int uid);

Regras Obrigatórias

  1. Vizinhos: Encontre usuários que deram avaliações similares (mesmo filme, nota \(\ge 4\)).
  2. Candidatos: Filmes que os vizinhos gostaram.
  3. Filtragem:
    • Remover filmes já vistos pelo usuario alvo.
    • Anti-Hater: Remover todos os filmes de diretores que o usuário alvo deu nota 1.
    • Variação Dinâmica: Aplicar a Regra de Vizinhos informada no argumento do comando (RESTRITO / TOLERANTE / ESPECIALIDADE).
  4. Ordenação Final (Novo Critério Java): A lista de filmes recomendados final deve estar perfeitamente ordenada. Implemente um Comparator (ou múltiplo) para ordenar por:
    • 1º: Média de Notas dos Vizinhos (maior para menor).
    • 2º: Ano de Lançamento (mais recente para mais antigo).
    • 3º: Ordem Alfabética do Título.

Exemplo de Uso Local (IDE)

// Setup Local de Testes (Na sua máquina)
Sistema s = new Sistema();
s.carregarDadosCSV("filmes.csv", "avaliacoes.csv"); 

// Execução
List<Filme> recom = s.recomendar(1, "RESTRITO");
System.out.println(recom); 
// Saída esperada: [Filme{titulo="Interestelar"...}, ...]

Lembre-se: O método main enviado ao Juiz Online lerá do System.in!

Checklist de Entrega

De volta ao topo