fixes + final document
This commit is contained in:
4
.gitignore
vendored
4
.gitignore
vendored
@@ -24,3 +24,7 @@
|
||||
hs_err_pid*
|
||||
replay_pid*
|
||||
|
||||
# Word Documents
|
||||
*.docx
|
||||
*.doc
|
||||
*.odt
|
||||
81
AVL.java
81
AVL.java
@@ -1,3 +1,4 @@
|
||||
import java.io.PrintWriter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
@@ -19,6 +20,50 @@ public class AVL {
|
||||
this.root = null;
|
||||
}
|
||||
|
||||
public void cleanup() {
|
||||
cleanupRec(root);
|
||||
root = null;
|
||||
}
|
||||
|
||||
private void cleanupRec(Node node) {
|
||||
if (node != null) {
|
||||
cleanupRec(node.left);
|
||||
cleanupRec(node.right);
|
||||
remove(node.programa.getId());
|
||||
}
|
||||
}
|
||||
|
||||
public void saveTreeToCSV(PrintWriter writer) {
|
||||
saveTreeToCSVRec(root, writer);
|
||||
}
|
||||
|
||||
private void saveTreeToCSVRec(Node node, PrintWriter writer) {
|
||||
if (node != null) {
|
||||
saveTreeToCSVRec(node.left, writer);
|
||||
|
||||
ProgramaNetflix p = node.programa;
|
||||
String line = "\"" + p.getId() + "\"," +
|
||||
"\"" + p.getTitulo() + "\"," +
|
||||
"\"" + p.getShow_type() + "\"," +
|
||||
"\"" + p.getDescricao() + "\"," +
|
||||
p.getRelease_year() + "," +
|
||||
"\"" + p.getAge_certification() + "\"," +
|
||||
p.getRuntime() + "," +
|
||||
"\"" + p.getGeneros() + "\"," +
|
||||
"\"" + p.getProductionCountries() + "\"," +
|
||||
p.getTemporadas() + "," +
|
||||
"\"" + p.getImdb_id() + "\"," +
|
||||
p.getImdb_score() + "," +
|
||||
p.getImdb_votes() + "," +
|
||||
p.getTmdb_popularity() + "," +
|
||||
p.getTmdb_score();
|
||||
|
||||
writer.println(line);
|
||||
|
||||
saveTreeToCSVRec(node.right, writer);
|
||||
}
|
||||
}
|
||||
|
||||
// Métodos de inserção e busca
|
||||
public void insert(ProgramaNetflix programa) {
|
||||
root = insertRec(root, programa);
|
||||
@@ -68,9 +113,15 @@ public class AVL {
|
||||
return root;
|
||||
}
|
||||
|
||||
public ProgramaNetflix search(String id) {
|
||||
public String search(String id) {
|
||||
count = 1;
|
||||
return searchRec(root, id);
|
||||
ProgramaNetflix programa = searchRec(root, id);
|
||||
|
||||
if (programa != null) {
|
||||
return programa.getTitulo();
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
private ProgramaNetflix searchRec(Node root, String id) {
|
||||
@@ -146,8 +197,12 @@ public class AVL {
|
||||
return y;
|
||||
}
|
||||
|
||||
public void remove(String id) {
|
||||
public boolean remove(String id) {
|
||||
if (search(id).isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
root = removeRec(root, id);
|
||||
return true;
|
||||
}
|
||||
|
||||
private Node removeRec(Node root, String id) {
|
||||
@@ -310,16 +365,24 @@ public class AVL {
|
||||
|
||||
private void inorderMediaDuracaoPorClassificacao(Node no, Map<String, Double> somaDuracaoPorClassificacao,
|
||||
Map<String, Integer> contagemPorClassificacao) {
|
||||
|
||||
if (no != null) {
|
||||
|
||||
inorderMediaDuracaoPorClassificacao(no.left, somaDuracaoPorClassificacao, contagemPorClassificacao);
|
||||
|
||||
String classificacao = no.programa.getAge_certification();
|
||||
int duracao = no.programa.getRuntime();
|
||||
if (no.programa.getShow_type().equals("SHOW")) {
|
||||
|
||||
// Atualiza a soma da duração e a contagem para a classificação indicativa
|
||||
somaDuracaoPorClassificacao.put(classificacao,
|
||||
somaDuracaoPorClassificacao.getOrDefault(classificacao, 0.0) + duracao);
|
||||
contagemPorClassificacao.put(classificacao, contagemPorClassificacao.getOrDefault(classificacao, 0) + 1);
|
||||
String classificacao = no.programa.getAge_certification();
|
||||
|
||||
int duracao = no.programa.getRuntime();
|
||||
|
||||
// Atualiza a soma da duração e a contagem para a classificação indicativa
|
||||
somaDuracaoPorClassificacao.put(classificacao,
|
||||
somaDuracaoPorClassificacao.getOrDefault(classificacao, 0.0) + duracao);
|
||||
|
||||
contagemPorClassificacao.put(classificacao,
|
||||
contagemPorClassificacao.getOrDefault(classificacao, 0) + 1);
|
||||
}
|
||||
|
||||
inorderMediaDuracaoPorClassificacao(no.right, somaDuracaoPorClassificacao, contagemPorClassificacao);
|
||||
}
|
||||
|
||||
32
BST.java
32
BST.java
@@ -23,7 +23,18 @@ public class BST {
|
||||
return minValue(root);
|
||||
}
|
||||
|
||||
// Método privado para encontrar o valor mínimo na subárvore
|
||||
public void cleanup() {
|
||||
cleanupRec(root);
|
||||
root = null;
|
||||
}
|
||||
|
||||
private void cleanupRec(Node node) {
|
||||
if (node != null) {
|
||||
cleanupRec(node.left);
|
||||
cleanupRec(node.right);
|
||||
remove(node.programa.getId());
|
||||
}
|
||||
}
|
||||
|
||||
private Node insertRec(Node root, ProgramaNetflix programa) {
|
||||
if (root == null) {
|
||||
@@ -41,9 +52,15 @@ public class BST {
|
||||
return root;
|
||||
}
|
||||
|
||||
public ProgramaNetflix search(String id) {
|
||||
count = 0;
|
||||
return searchRec(root, id);
|
||||
public String search(String id) {
|
||||
count = 1;
|
||||
ProgramaNetflix programa = searchRec(root, id);
|
||||
|
||||
if (programa != null) {
|
||||
return programa.getTitulo();
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
private ProgramaNetflix searchRec(Node root, String id) {
|
||||
@@ -84,9 +101,12 @@ public class BST {
|
||||
return Math.max(leftHeight, rightHeight) + 1;
|
||||
}
|
||||
|
||||
// Outros métodos BST conforme necessário
|
||||
public void remove(String id) {
|
||||
public boolean remove(String id) {
|
||||
if (search(id).isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
root = removeRec(root, id);
|
||||
return true;
|
||||
}
|
||||
|
||||
private Node removeRec(Node root, String id) {
|
||||
|
||||
BIN
Document1.pdf
Normal file
BIN
Document1.pdf
Normal file
Binary file not shown.
97
Main.java
97
Main.java
@@ -1,5 +1,4 @@
|
||||
import java.io.BufferedReader;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
@@ -8,10 +7,15 @@ import java.util.*;
|
||||
|
||||
public class Main {
|
||||
|
||||
private static void lerDadosDeArquivo(BST arvoreBST, AVL arvoreAVL) {
|
||||
private static void lerDadosDeArquivo(Scanner entrada, BST arvoreBST, AVL arvoreAVL) {
|
||||
int incompletecount = 0;
|
||||
|
||||
try (InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("titles.csv");
|
||||
arvoreBST.cleanup();
|
||||
arvoreAVL.cleanup();
|
||||
|
||||
System.out.print("Insira o nome do arquivo CSV: ");
|
||||
String csvFileName = entrada.nextLine();
|
||||
try (InputStream inputStream = Main.class.getClassLoader().getResourceAsStream(csvFileName);
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream))) {
|
||||
String line;
|
||||
br.readLine();
|
||||
@@ -53,21 +57,11 @@ public class Main {
|
||||
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
System.out.println("Erro ao ler o arquivo " + csvFileName);
|
||||
}
|
||||
System.out.println(incompletecount + " linhas ignoradas devido à falta de informações.");
|
||||
}
|
||||
|
||||
private static void treeToFile(List<String> data, String fileName) {
|
||||
try (PrintWriter writer = new PrintWriter(fileName)) {
|
||||
for (String line : data) {
|
||||
writer.println(line);
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private static String[] splitCSVLine(String line) {
|
||||
List<String> fields = new ArrayList<>();
|
||||
boolean aspas = false;
|
||||
@@ -123,7 +117,7 @@ public class Main {
|
||||
|
||||
switch (opcao) {
|
||||
case 1: // FUNCIONANDO
|
||||
lerDadosDeArquivo(arvoreBST, arvoreAVL);
|
||||
lerDadosDeArquivo(entrada, arvoreBST, arvoreAVL);
|
||||
break;
|
||||
case 2: // FUNCIONANDO
|
||||
// 1
|
||||
@@ -141,7 +135,7 @@ public class Main {
|
||||
entrada.nextLine();
|
||||
|
||||
// 3
|
||||
System.out.print("Duração média por classificação etária\n");
|
||||
System.out.print("Duração média de um episódio de uma série por classificação etária\n");
|
||||
arvoreAVL.mediaDuracaoPorClassificacao();
|
||||
|
||||
System.out.print("\nPressione ENTER para continuar...\n");
|
||||
@@ -215,10 +209,26 @@ public class Main {
|
||||
age_certification, runtime, generos, production_countries, temporadas, imdb_id, imdb_score,
|
||||
imdb_votes, tmdb_popularity, tmdb_score);
|
||||
|
||||
arvoreAVL.insert(programa);
|
||||
arvoreBST.insert(programa);
|
||||
System.out.println("Valor na Árvore AVL: " + arvoreAVL.search(id));
|
||||
System.out.println("Valor na Árvore BST: " + arvoreBST.search(id));
|
||||
if (arvoreAVL.search(id).isEmpty() || arvoreBST.search(id).isEmpty()) {
|
||||
arvoreAVL.insert(programa);
|
||||
arvoreBST.insert(programa);
|
||||
System.out.println("Valor na Árvore AVL: " + arvoreAVL.search(id));
|
||||
System.out.println("Valor na Árvore BST: " + arvoreBST.search(id));
|
||||
} else {
|
||||
System.out.println("Programa já existe em pelo menos uma árvore");
|
||||
System.out.println("Deseja sobrescrever? (S/N)");
|
||||
String resposta = sc.nextLine();
|
||||
resposta = sc.nextLine();
|
||||
|
||||
if (resposta.equalsIgnoreCase("S")) {
|
||||
arvoreAVL.remove(id);
|
||||
arvoreBST.remove(id);
|
||||
arvoreAVL.insert(programa);
|
||||
arvoreBST.insert(programa);
|
||||
System.out.println("Valor na Árvore AVL: " + arvoreAVL.search(id));
|
||||
System.out.println("Valor na Árvore BST: " + arvoreBST.search(id));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 4: // FUNCIONANDO
|
||||
@@ -227,37 +237,52 @@ public class Main {
|
||||
|
||||
// Buscar na AVL
|
||||
long startTimeAVL = System.nanoTime();
|
||||
arvoreAVL.search(programaId);
|
||||
String nomeSerieAVL = arvoreAVL.search(programaId);
|
||||
long endTimeAVL = System.nanoTime();
|
||||
long durationAVL = (endTimeAVL - startTimeAVL);
|
||||
|
||||
// Buscar na BST
|
||||
long startTimeBST = System.nanoTime();
|
||||
arvoreBST.search(programaId);
|
||||
String nomeSerieBST = arvoreBST.search(programaId);
|
||||
long endTimeBST = System.nanoTime();
|
||||
long durationBST = (endTimeBST - startTimeBST);
|
||||
|
||||
// Exibir as estatísticas da AVL
|
||||
System.out.println("Nodes tocados pela arvore AVL: " + arvoreAVL.getCount());
|
||||
System.out.println("\nNodes tocados pela arvore AVL: " + arvoreAVL.getCount());
|
||||
System.out.println("Tempo de execução da busca na AVL: " + durationAVL + " nanossegundos");
|
||||
if (nomeSerieAVL.isEmpty()) {
|
||||
System.out.println("Não encontrado na árvore AVL!");
|
||||
} else {
|
||||
System.out.println("Encontrado na árvore AVL: " + nomeSerieAVL);
|
||||
}
|
||||
|
||||
// Exibir as estatísticas da BST
|
||||
System.out.println("Nodes tocados pela arvore BST: " + arvoreBST.getCount());
|
||||
System.out.println("\nNodes tocados pela arvore BST: " + arvoreBST.getCount());
|
||||
System.out.println("Tempo de execução da busca na BST: " + durationBST + " nanossegundos");
|
||||
|
||||
if (nomeSerieBST.isEmpty()) {
|
||||
System.out.println("Não encontrado na árvore BST!");
|
||||
} else {
|
||||
System.out.println("Encontrado na árvore BST: " + nomeSerieBST);
|
||||
}
|
||||
break;
|
||||
|
||||
case 5: // FUNCIONANDO
|
||||
case 5: // FUNCIONANDO (REMOVER DA AVL E DA BST)
|
||||
System.out.print("Informe o ID do programa a ser removido: ");
|
||||
String id_remove = entrada.nextLine().trim().toLowerCase();
|
||||
|
||||
// Remover da AVL
|
||||
arvoreAVL.remove(id_remove);
|
||||
System.out.println("Programa removido da AVL");
|
||||
if (arvoreAVL.remove(id_remove)) {
|
||||
System.out.println("Programa removido da AVL");
|
||||
} else {
|
||||
System.out.println("Programa não encontrado na AVL, nada removido");
|
||||
}
|
||||
|
||||
// Remover da BST
|
||||
arvoreBST.remove(id_remove);
|
||||
System.out.println("Programa removido da BST");
|
||||
if (arvoreBST.remove(id_remove)) {
|
||||
System.out.println("Programa removido da BST");
|
||||
} else {
|
||||
System.out.println("Programa não encontrado na BST, nada removido");
|
||||
}
|
||||
break;
|
||||
|
||||
case 6:
|
||||
@@ -273,7 +298,17 @@ public class Main {
|
||||
case 7:
|
||||
System.out.print("Insira o nome do arquivo: ");
|
||||
String fileName = entrada.nextLine();
|
||||
treeToFile(arvoreAVL.dataToStringList(), fileName);
|
||||
|
||||
try (PrintWriter writer = new PrintWriter(fileName)) {
|
||||
|
||||
writer.println(
|
||||
"id,title,type,description,release_year,age_certification,runtime,genres,production_countries,seasons,imdb_id,imdb_score,imdb_votes,tmdb_popularity,tmdb_score");
|
||||
arvoreAVL.saveTreeToCSV(writer);
|
||||
|
||||
} catch (Exception e) {
|
||||
// tratar erro de arquivo
|
||||
System.out.println("Erro ao salvar o arquivo " + fileName);
|
||||
}
|
||||
break;
|
||||
|
||||
case 8:
|
||||
|
||||
Reference in New Issue
Block a user