Advertisement
Guest User

Untitled

a guest
May 4th, 2016
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 19.47 KB | None | 0 0
  1. package tps.tp2.pack3Coleccoes;
  2.  
  3. import java.util.Arrays;
  4.  
  5.  
  6.  
  7.  
  8. import tps.tp2.pack2Livros.Livro;  // estaremos a trabalhar com a classe Livro do pack2Livros
  9.  
  10. /**
  11.  * Classe Coleccao, deve conter a descrição de uma colecção, com título, os seus
  12.  * livros, colecções e editores
  13.  */
  14. public class Coleccao {
  15.     // número máximo de obras de uma colecção
  16.     private static int MAXOBRAS = 20;
  17.  
  18.     // prefixo usual
  19.     public static final String GENERALPREFIX = "  ";
  20.  
  21.     // título da colecção
  22.     private String titulo;
  23.  
  24.     // Array de livros, em que estas encontram-se sempre nos menores índices e
  25.     // pela ordem de registo
  26.     private Livro[] livros = new Livro[MAXOBRAS];
  27.  
  28.     // deverá conter sempre o número de livros na colecção
  29.     private int numLivros = 0;
  30.  
  31.     // array de colecções, estas devem ocupar sempre os menores índices
  32.     private Coleccao[] coleccoes = new Coleccao[MAXOBRAS];
  33.  
  34.     // deverá conter sempre o número de colecções dentro da colecção
  35.     private int numColeccoes = 0;
  36.  
  37.     // Editores, tem as mesmas condicionantes que array de autores na classe
  38.     // livro
  39.     private String[] editores;
  40.  
  41.     /**
  42.      * Construtor; o título tem de ter pelo menos um caracter que não seja um
  43.      * espaço (Character.isWhitespace); o array de editores devem ser pelo menos
  44.      * um e têm as mesmas restrições que os autores dos livros;
  45.      */
  46.     public Coleccao(String titulo, String[] editores) {
  47.         // titulo
  48.         if (titulo == null || titulo.length() == 0)
  49.             throw new IllegalArgumentException(
  50.                     "O titulo tem de ter pelo menos um caracter");
  51.         this.titulo = titulo;
  52.  
  53.         // ALTERADO: Validar o numero de editores fora do for, porque não vale a pena verificar isto tantas vezes quantos
  54.         // editores existem.
  55.         if( editores.length == 0 )
  56.             throw new IllegalArgumentException("Os autores deve conter pelo menos um autor válido ");
  57.        
  58.         // FEITO
  59.         for (int i = 0; i < editores.length; i++) {
  60.             if(editores[i] == null ){
  61.                 throw new IllegalArgumentException("Os autores não deve conter nulls");
  62.             }
  63.         }
  64.         this.editores = editores;
  65.     }
  66.  
  67.     /**
  68.      *
  69.      */
  70.     public String getTitulo() {
  71.         // FEITO
  72.         return this.titulo;
  73.     }
  74.  
  75.     /**
  76.      * Obtem o número total de páginas da colecção, páginas dos livros e das
  77.      * colecções
  78.      */
  79.     public int getNumPaginas() {
  80.         // FEITO
  81.         int numPaginas=0;
  82.                
  83.         for (int i = 0; i < numLivros; i++) {
  84.             numPaginas += livros[i].getNumPaginas();
  85.         }      
  86.        
  87.         for (int i = 0; i < numColeccoes; i++) {
  88.             numPaginas += coleccoes[i].getNumPaginas();
  89.         }
  90.        
  91.         return numPaginas;
  92.     }
  93.  
  94.     /**
  95.      * As colecções com mais de 5000 páginas nos seus livros directos têm um
  96.      * desconto de 20% nesses livros. As colecções em que o somatório de páginas
  97.      * das suas subcolecções directas seja igual ou superior ao quádruplo do nº
  98.      * de páginas da sua subcolecção directa com mais páginas deverão aplicar um
  99.      * desconto de 10% sobre os preços das suas subcolecções
  100.      */
  101.     public float getPreco() {
  102.         // FEITO. MOSTRAR VANESSA
  103.         float precoLivros = 0;
  104.        
  105.         int numPaginasDosLivros = 0;
  106.         // Primeiro obtem-se o preço do numero de livros
  107.         for( int i = 0; i < numLivros; i++ ) {
  108.             numPaginasDosLivros += livros[i].getNumPaginas();
  109.             precoLivros += livros[i].getPreco();
  110.         }
  111.        
  112.         // Se a soma de páginas dos livros (apenas) for mais de 5000, aplica 20% de desconto sobre esses livros
  113.         if ( numPaginasDosLivros > 5000 ) {
  114.             float desconto = precoLivros * 0.2f;
  115.             precoLivros = precoLivros - desconto;
  116.         }
  117.        
  118.         // Depois obtem-se e calcula-se o preço das coleções
  119.         float precoColecoes = 0;
  120.         int maxNumPaginasColecao = 0; // valor do número de páginas da coleção directa com mais páginas
  121.         int totalNumPaginasColecao = 0;
  122.         for (int i = 0; i < numColeccoes; i++) {
  123.             int numPaginasSubColecao = coleccoes[i].getNumPaginas();
  124.             precoColecoes += coleccoes[i].getPreco();
  125.             totalNumPaginasColecao += numPaginasSubColecao;
  126.            
  127.             // Actualiza o valor máximo de páginas encontrado, caso o numero seja maior até ao momento seja excedido
  128.             if( numPaginasSubColecao > maxNumPaginasColecao ) {
  129.                 maxNumPaginasColecao = numPaginasDosLivros;
  130.             }
  131.         }
  132.        
  133.         if( totalNumPaginasColecao >= 4 * maxNumPaginasColecao ) {
  134.             float desconto = precoColecoes * 0.1f;
  135.             precoColecoes = precoColecoes - desconto;
  136.         }
  137.        
  138.         return precoLivros + precoColecoes;
  139.     }
  140.  
  141.     /**
  142.      * Adiciona um livro à colecção se puder e este não seja null e a colecção
  143.      * não ficar com livros iguais ao nível imediato da colecção. Deve utilzar o
  144.      * método getIndexOfLivro e getIndexOfColeccao
  145.      */
  146.     public boolean addLivro(Livro livro) {
  147.         // FEITO
  148.  
  149.         if (livro != null && getIndexOfLivro(livro.getTitulo())== -1 && getIndexOfColeccao(livro.getTitulo())== -1){
  150.             livros[numLivros++] = livro;
  151.  
  152.             return true;
  153.         }
  154.         return false;
  155.     }
  156.  
  157.     /**
  158.      *
  159.      * Adiciona uma colecção à colecção se puder, esta não seja null e a
  160.      * colecção não ficar com obras imediatas com títulos repetidos. Deve
  161.      * utilizar o método getIndexOfLivro e getIndexOfColeccao
  162.      */
  163.     public boolean addColeccao(Coleccao col) {
  164.         // FEITO
  165.  
  166.         if (col != null && getIndexOfLivro(col.getTitulo())== -1 && getIndexOfColeccao(col.getTitulo())== -1){
  167.             coleccoes[numColeccoes++] = col;
  168.            
  169.             return true;
  170.         }
  171.         return false;
  172.     }
  173.  
  174.     /**
  175.      * Devolve o index no array de livros onde estiver o livro com o nome
  176.      * pretendido. Devolve -1 caso não o encontre
  177.      */
  178.     private int getIndexOfLivro(String titulo) {
  179.         // FEITO
  180.        
  181.         for (int i = 0; i < numLivros; i++) {
  182.             if(livros[i] != null && livros[i].getTitulo().equals(titulo)){
  183.                 return i;
  184.             }
  185.         }
  186.         return -1;
  187.     }
  188.  
  189.     /**
  190.      * Devolve o index no array de colecções onde estiver a colecção com o nome
  191.      * pretendido. Devolve -1 caso não o encontre
  192.      */
  193.     private int getIndexOfColeccao(String titulo) {
  194.         // FEITO
  195.         for (int i = 0; i < numColeccoes; i++) {
  196.             if(coleccoes[i] != null && coleccoes[i].getTitulo().equals(titulo)){
  197.                 return i;
  198.             }
  199.         }
  200.         return -1;
  201.     }
  202.  
  203.     /**
  204.      * Remove do array o livro com o título igual ao título recebido. Devolve o
  205.      * livro removido ou null caso não tenha encontrado o livro. Deve-se
  206.      * utilizar o método getIndexOfLivro. Recorda-se que os livros devem ocupar
  207.      * sempre os menores índices, ou seja, não pode haver nulls entre os livros
  208.      */
  209.     public Livro remLivro(String titulo) {
  210.         // FEITO
  211.         Livro livroRemovido = null;
  212.                
  213.         if(getIndexOfLivro(titulo) == -1)
  214.             return null;
  215.                
  216.         for (int i = 0; i < numLivros; i++) {
  217.             livroRemovido = livros[i];
  218.             livros[i] = null;
  219.             numLivros--;
  220.         }
  221.                
  222.         Livro livrosNovos [] = new Livro[livros.length];
  223.         int indexLivrosNovos=0;
  224.                
  225.         for (int i = 0; i < livrosNovos.length; i++) {
  226.             if(livros[i]!= null){
  227.                 livrosNovos[indexLivrosNovos++]= livros[i];
  228.             }
  229.         }
  230.         this.livros = livrosNovos;
  231.            
  232.         return livroRemovido;
  233.        
  234.  
  235.     }
  236.  
  237.     /**
  238.      * Remove do array de colecções a colecção com o título igual ao título
  239.      * recebido. Devolve a colecção removida ou null caso não tenha encontrado.
  240.      * Deve-se utilizar o método getIndexOfColeccao. Recorda-se que as colecções
  241.      * devem ocupar sempre os menores índices, ou seja, não pode haver nulls
  242.      * entre elas
  243.      */
  244.     public Coleccao remColeccao(String titulo) {
  245.         // FEITO
  246.         Coleccao colecaoRemovida = null;
  247.        
  248.         if( getIndexOfColeccao(titulo)==-1 ) {
  249.             return null;
  250.         }
  251.         for (int i = 0; i < numColeccoes; i++) {
  252.             colecaoRemovida = coleccoes[i];
  253.             coleccoes[i] = null;
  254.             numColeccoes--;
  255.         }
  256.         Coleccao novasColecoes [] = new Coleccao[coleccoes.length];
  257.         int indexColecoesNovas = 0;
  258.         for (int i = 0; i < novasColecoes.length; i++) {
  259.             if(coleccoes[i] != null) {
  260.                 novasColecoes[indexColecoesNovas++] = coleccoes[i];
  261.             }
  262.         }
  263.         this.coleccoes = novasColecoes;
  264.        
  265.         return colecaoRemovida;
  266.     }
  267.  
  268.     /**
  269.      * Devolve o nº de obras de uma pessoa. Cada colecção deve contabilizar-se
  270.      * como uma obra para os editores.
  271.      */
  272.     public int getNumObrasFromPerson(String autorEditor) {
  273.         // FEITO. ALTERADO MOSTRAR VANESSA
  274.         int numObras =0;
  275.                
  276.         // conta o numero de livros em que o autor está presente (ALTERADO)
  277.         for (int i = 0; i < numLivros; i++) {
  278.             if(livros[i].contemAutor(autorEditor)){
  279.                     numObras++;
  280.             }
  281.         }
  282.        
  283.         // ver se o autor está presente na coleção actual
  284.         for( int i = 0; i < editores.length; i++) {
  285.             if( editores[i].equals(autorEditor) ) {
  286.                 numObras++;
  287.                 break;
  288.             }
  289.         }
  290.        
  291.         // conta o número de obras que o autor tem nas colecções
  292.         for (int i = 0; i < numColeccoes; i++) {
  293.             // ver quantos livros o autor tem na colecao
  294.             numObras += coleccoes[i].getNumObrasFromPerson(autorEditor);
  295.         }
  296.        
  297.         return numObras;
  298.     }
  299.  
  300.     /**
  301.      * Devolver um novo array (sem nulls) com os livros de que a pessoa recebida
  302.      * é autor. Não deve conter repetições, para excluir as repetições devem
  303.      * utilizar o método mergeWithoutRepetitions
  304.      */
  305.     public Livro[] getLivrosComoAutor(String autorNome) {
  306.  
  307.         //FEITO
  308.         Livro[] livrosAutoresComNull = new Livro[numLivros];
  309.         int numLivrosAutor = 0;
  310.        
  311.         // percorrer a lista de livros
  312.         for (int i = 0; i < numLivros; i++) {
  313.             if(livros[i].contemAutor(autorNome)){ // se o livro contiver o autor, adicionamos a lista
  314.                 livrosAutoresComNull[numLivrosAutor] = livros[i];
  315.                 numLivrosAutor++;
  316.             }
  317.         }
  318.  
  319.         // retirar os nulos da lista
  320.         Livro[] livrosAutores= new Livro[ numLivrosAutor ];
  321.         for(int i = 0; i < livrosAutores.length; i++ ) {
  322.             livrosAutores[i] = livrosAutoresComNull[i];
  323.         }
  324.        
  325.         // obter agora os livros das coleccoes (adicionado)
  326.         for(int i = 0; i < numColeccoes; i++) {
  327.             livrosAutores = mergeWithoutRepetitions(livrosAutores, coleccoes[i].getLivrosComoAutor(autorNome));
  328.         }
  329.        
  330.         return livrosAutores;
  331.  
  332.     }
  333.  
  334.     /**
  335.      * Deve devolver uma string compatível com os outputs desejados
  336.      */
  337.     public String toString() {
  338.         // FEITO - Explicar
  339.         String resultado = new String();
  340.        
  341.         resultado = "Coleção " + this.titulo + ", editores" + Arrays.toString(this.editores) + ", " + this.numLivros + " livros, "
  342.                         + this.getNumPaginas() + "p " + this.getPreco() + "€";
  343.                
  344.         return resultado;
  345.     }
  346.     /**
  347.      * Deve devolver um array, sem nulls, com todos os autores e editores
  348.      * existentes na colecção. O resultado não deve conter repetições. Deve
  349.      * utilizar o método mergeWithoutRepetitions
  350.      */
  351.     public String[] getAutoresEditores() {
  352.  
  353.         // FEITO
  354.         String[] arraySemRep = this.editores;
  355.         for (int i = 0; i < numLivros; i++) {
  356.             arraySemRep = mergeWithoutRepetitions(arraySemRep, this.livros[i].getAutores());
  357.         }
  358.        
  359.         // Adicionar os autores/editores das colecoes (ALTERADO/FALTAVA)
  360.         for( int i = 0; i < numColeccoes; i++ ) {
  361.             arraySemRep = mergeWithoutRepetitions(arraySemRep, this.coleccoes[i].getAutoresEditores() );
  362.         }
  363.        
  364.         return arraySemRep;
  365.  
  366.     }
  367.  
  368.     /**
  369.      * Método que recebendo dois arrays sem repetições devolve um novo array com
  370.      * todos os elementos dos arrays recebidos mas sem repetições
  371.      */
  372.     private static String[] mergeWithoutRepetitions(String[] a1, String[] a2) {
  373.         //FEITO
  374.        
  375.         int index = 0;
  376.         int contarRepetidos = 0;
  377.         String novoArrayComNulls[] = new String[a1.length+a2.length];
  378.        
  379.         for (int i = 0; i < a1.length; i++) { //adiciona os elementos do array 1 ao novo array que está vazio
  380.             novoArrayComNulls[index++] = a1[i];
  381.         }
  382.        
  383.         // adiciona os elementos do array 2 se no novo array esse elemento ainda não existir
  384.         for (int i = 0; i < a2.length; i++) {
  385.             boolean existe = false; // variavel para controlar se o elemento existe no novo array
  386.            
  387.             for( int j = 0; j < novoArrayComNulls.length; j++ ) { // percorrer o novo array à procura do elemento actual
  388.                 if( a2[i].equals(novoArrayComNulls[j]) ) { // o elemento existe, portanto assinalamos e saimos do ciclo
  389.                     existe = true;
  390.                     break;
  391.                 }
  392.             }
  393.            
  394.             // depois de percorrer o array todo, sabemos que o nº não existe, por isso vamos adiciona-lo
  395.             if( existe == false ) {
  396.                 novoArrayComNulls[index++] = a2[i];
  397.             } else { // já existe, portanto temos que incrementar o contador de repetidos
  398.                 contarRepetidos++;
  399.             }
  400.            
  401.         }
  402.        
  403.         // temos que remover os nulls do novoArrayComNulls
  404.         String[] novoArray = new String[ novoArrayComNulls.length - contarRepetidos ];
  405.         // copiar o array com nulos para o novo array sem posições nulas
  406.         for( int i = 0; i < novoArray.length; i++) {
  407.             novoArray[i] = novoArrayComNulls[i];
  408.         }
  409.    
  410.         return novoArray;
  411.  
  412.     }
  413.  
  414.     /**
  415.      * Método idêntico ao método anterior mas agora com arrays de livros
  416.      */
  417.     private static Livro[] mergeWithoutRepetitions(Livro[] a1, Livro[] a2) {
  418.         // FEITO
  419.  
  420.         int index = 0;
  421.         int contarRepetidos = 0;
  422.         Livro arrayLivrosComNulls[] = new Livro[a1.length+a2.length];
  423.        
  424.         for (int i = 0; i < a1.length; i++) { //adiciona os elementos do array 1 ao novo array que está vazio
  425.             arrayLivrosComNulls[index++] = a1[i];
  426.         }
  427.        
  428.         // adiciona os elementos do array 2 se no novo array esse elemento ainda não existir
  429.         for (int i = 0; i < a2.length; i++) {
  430.             boolean existe = false; // variavel para controlar se o elemento existe no novo array
  431.            
  432.             for( int j = 0; j < arrayLivrosComNulls.length; j++ ) { // percorrer o novo array à procura do elemento actual
  433.                 if( a2[i].equals(arrayLivrosComNulls[j]) ) { // o elemento existe, portanto assinalamos e saimos do ciclo
  434.                     existe = true;
  435.                     break;
  436.                 }
  437.             }
  438.            
  439.             // depois de percorrer o array todo, sabemos que o nº não existe, por isso vamos adiciona-lo
  440.             if( existe == false ) {
  441.                 arrayLivrosComNulls[index++] = a2[i];
  442.             } else { // já existe, portanto temos que incrementar o contador de repetidos
  443.                 contarRepetidos++;
  444.             }
  445.            
  446.         }
  447.        
  448.         // temos que remover os nulls do arrayLivrosComNulls
  449.         Livro[] arrayLivros = new Livro[ arrayLivrosComNulls.length - contarRepetidos ];
  450.         // copiar o array com nulos para o novo array sem posições nulas
  451.         for( int i = 0; i < arrayLivros.length; i++) {
  452.             arrayLivros[i] = arrayLivrosComNulls[i];
  453.         }
  454.    
  455.         return arrayLivros;
  456.  
  457.     }
  458.  
  459.     /**
  460.      * Devolve true caso a colecção recebida tenha o mesmo título e a mesma
  461.      * lista de editores. Para verificar se os editores são os mesmos
  462.      * devem utilizar o método mergeWithoutRepetitions
  463.      */
  464.     public boolean equals(Coleccao c) {
  465.         // FEITO. Alterado de 'editores' para 'getAutoresEditores()'
  466.        
  467.         if(!this.getTitulo().equals(c.getTitulo())) {
  468.             return false;
  469.         }
  470.  
  471.         if((mergeWithoutRepetitions(c.getAutoresEditores(),this.getAutoresEditores()).length == this.getAutoresEditores().length) && this.getAutoresEditores().length == c.getAutoresEditores().length) {
  472.             return true;
  473.         }
  474.         return false;
  475.  
  476.     }
  477.  
  478.     /**
  479.      * Mostra uma colecção segundo os outputs desejados
  480.      */
  481.     public void print(String prefix) {
  482.         // FEITO
  483.         System.out.println(prefix + this);
  484.         // AQUI
  485.         //Falta um for para imprimir as coleções
  486.        
  487.         //faltou este for para imprimir os livros existentes nas coleçoes
  488.         for (int i = 0; i < numLivros; i++) {
  489.             if(livros[i]== null)
  490.                 continue;
  491.                    
  492.             livros[i].print("  " + prefix); // para imprimir em profundidade chama a funcao print do livro (alterado)
  493.                    
  494.         }
  495.        
  496.         for (int i = 0; i < numColeccoes; i++) {
  497.             if(coleccoes[i] ==null)
  498.                 continue;
  499.             coleccoes[i].print("  " + prefix); // o mesmo para as coleções
  500.         }
  501.        
  502.     }
  503.  
  504.     /**
  505.      * main
  506.      */
  507.     public static void main(String[] args) {
  508.         Livro l1 = new Livro("Viagem aos Himalaias", 340, 12.3f,
  509.                 new String[] { "João Mendonça", "Mário Andrade" });
  510.         Livro l2 = new Livro("Viagem aos Pirinéus", 270, 11.5f,
  511.                 new String[] { "João Mendonça", "Júlio Pomar" });
  512.  
  513.         Coleccao c1 = new Coleccao("Primavera",
  514.                 new String[] { "João Mendonça", "Manuel Alfazema" });
  515.  
  516.         boolean res;
  517.  
  518.         res = c1.addLivro(l1);
  519.         res = c1.addLivro(l2);
  520.         System.out.println("c1 -> " + c1);
  521.         c1.print("");
  522.         System.out.println();
  523.  
  524.         // adicionar um livro com nome de outro já existente
  525.         res = c1.addLivro(l2);
  526.         System.out.println(
  527.                 "adição novamente de Viagem aos Pirinéus a c1 -> " + res);
  528.         System.out.println("c1 -> " + c1);
  529.         System.out.println();
  530.  
  531.         // Outra colecção
  532.         Livro l21 = new Livro("Viagem aos Himalaias 2", 340, 12.3f,
  533.                 new String[] { "João Mendonça", "Mário Andrade" });
  534.         Livro l22 = new Livro("Viagem aos Pirinéus 2", 270, 11.5f,
  535.                 new String[] { "João Mendonça", "Júlio Pomar" });
  536.  
  537.         Coleccao cx2 = new Coleccao("Outono",
  538.                 new String[] { "João Mendonça", "Manuel Antunes" });
  539.         cx2.addLivro(l21);
  540.         cx2.addLivro(l22);
  541.         System.out.println("cx2 -> " + cx2);
  542.         cx2.print("");
  543.         System.out.println();
  544.  
  545.         // adicioná-la a c1
  546.         c1.addColeccao(cx2);
  547.         System.out.println("c1 após adição da colecção cx2 -> " + c1);
  548.         c1.print("");
  549.         System.out.println();
  550.  
  551.         // get editores autores
  552.         String[] ae = c1.getAutoresEditores();
  553.         System.out.println("Autores editores of c1 -> " + Arrays.toString(ae));
  554.         System.out.println();
  555.  
  556.         // getNumObrasFromPerson
  557.         String nome = "João Mendonça";
  558.         int n = c1.getNumObrasFromPerson(nome);
  559.         System.out.println("Nº de obras de " + nome + " -> " + n);
  560.         System.out.println();
  561.  
  562.         // getLivrosComoAutor
  563.         nome = "João Mendonça";
  564.         Livro[] obras = c1.getLivrosComoAutor(nome);
  565.         System.out
  566.                 .println("Livros de " + nome + " -> " + Arrays.toString(obras));
  567.         System.out.println();
  568.  
  569.         // rem livro
  570.         String nomeLivro = "Viagem aos Himalaias";
  571.         Livro l = c1.remLivro(nomeLivro);
  572.         System.out.println("Remoção de " + nomeLivro + " -> " + l);
  573.         c1.print("");
  574.         System.out.println();
  575.     }
  576. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement