diff --git a/.gitignore b/.gitignore index 9154f4c..af1037a 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,7 @@ hs_err_pid* replay_pid* +# Word Documents +*.docx +*.doc +*.odt \ No newline at end of file diff --git a/AVL.java b/AVL.java index 35efe0b..10660d5 100644 --- a/AVL.java +++ b/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 somaDuracaoPorClassificacao, Map 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); } diff --git a/BST.java b/BST.java index 59669c7..2906152 100644 --- a/BST.java +++ b/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) { diff --git a/Document1.pdf b/Document1.pdf new file mode 100644 index 0000000..f2fb71c Binary files /dev/null and b/Document1.pdf differ diff --git a/Main.java b/Main.java index 2fefc67..34f1df9 100644 --- a/Main.java +++ b/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 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 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: