Enunciado: Implementação em Java
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:
HashMappara indexação em \(\mathcal{O}(1)\)HashSetpara 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.
Todos os dados devem ser lidos via Entrada Padrão (System.in) utilizando:
Scanner- ou
BufferedReader
Você deverá implementar as seguintes classes de modelo:
FilmeUsuarioAvaliacao
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
- Vizinhos: Encontre usuários que deram avaliações similares (mesmo filme, nota \(\ge 4\)).
- Candidatos: Filmes que os vizinhos gostaram.
- 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).
- 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!