Prévia do material em texto
Universidade Federal de PernambucoUniversidade Federal de Pernambuco Centro de InformáticaCentro de Informática P1 – Strings, Enum, Arrays Universidade Federal de PernambucoUniversidade Federal de Pernambuco Centro de InformáticaCentro de Informática © 2010, Roberto S. M. Barros, Ph.D. 1 P1 – Strings, Enum, Arrays Prof. Roberto Souto Maior de Barros roberto@cin.ufpe.br Tipos referência • Em Java há dois conjuntos de tipos – Tipos primitivos – Tipos referência • Tipos primitivos – alocação estática © 2010, Roberto S. M. Barros, Ph.D. 2 • Tipos primitivos – alocação estática – int, long, double, float, ... • Tipos referência – alocação dinâmica – classes, interfaces, arrays, ... Tipos de referência • Em Java não se trabalha diretamente com os objetos e sim com seus endereços, i.e. referências a objetosreferências a objetos • Isso tem implicações na maneira em que © 2010, Roberto S. M. Barros, Ph.D. 3 • Isso tem implicações na maneira em que objetos são comparados e copiados Referências Objetos são manipulados através de referências c == nullc == nullConta c = Conta c = nullnull;; c = c = newnew Conta (“1287”,0);Conta (“1287”,0); cc © 2010, Roberto S. M. Barros, Ph.D. 4 c = c = newnew Conta (“1287”,0);Conta (“1287”,0); c.getSaldo();c.getSaldo(); cc chama o método chama o método getSaldogetSaldo do do objeto referenciado pela variável cobjeto referenciado pela variável c Mais de uma variável pode armazenar a referência de um mesmo objeto Conta a = Conta a = newnew Conta(“123Conta(“123--4”,340.0);4”,340.0); Conta b;Conta b; aa e e bb passam a referenciarpassam a referenciar Referências © 2010, Roberto S. M. Barros, Ph.D. 5 Conta b;Conta b; b = a; b = a; b.creditar(100);b.creditar(100); SystemSystem.out.println(a.getSaldo());.out.println(a.getSaldo()); aa e e bb passam a referenciarpassam a referenciar a mesma contaa mesma conta qualquer efeito via qualquer efeito via bb é refletido via é refletido via aa Strings • São seqüências de caracteres • Não há um tipo primitivo para Strings em Java • Em Java, Strings são objetos! • Classe String disponibilizada em API Java © 2010, Roberto S. M. Barros, Ph.D. 6 • Classe String disponibilizada em API Java String mensagem = “Operação concluída com sucesso”;String mensagem = “Operação concluída com sucesso”;String mensagem = “Operação concluída com sucesso”;String mensagem = “Operação concluída com sucesso”; Aqui Java cria um novo objetoAqui Java cria um novo objeto do tipo String e armazena sua do tipo String e armazena sua referência na variávelreferência na variável mensagemmensagem Concatenação de Strings • Operador + é usado para concatenação String nome = "George"; String nome = "George"; String sobrenome = "Bush";String sobrenome = "Bush"; String nomeCompleto = nome + " " + sobrenome;String nomeCompleto = nome + " " + sobrenome; © 2010, Roberto S. M. Barros, Ph.D. 7 intint anos = 10;anos = 10; doubledouble rendimento = 1270.49;rendimento = 1270.49; String s = "Em " + anos + " anos o " +String s = "Em " + anos + " anos o " + "rendimento será de " + rendimento;"rendimento será de " + rendimento; SystemSystem.out.println(s);.out.println(s); A conversão para A conversão para String é feita String é feita automaticamenteautomaticamente Strings são tipos referência String s1 = "George"; String s2 = "George"; s1s1 s2s2 GGeeoo rr ggee s1 = s1 + " Bush";s1 = s1 + " Bush"; s2 = s2 + " Bush";s2 = s2 + " Bush"; Ao manipular um String, Ao manipular um String, © 2010, Roberto S. M. Barros, Ph.D. 8 s1s1 s2s2 GGeeoo rr ggeeGGeeoo rr ggee BBuu sshh GGeeoo rr ggee BBuu sshh s2 = s2 + " Bush";s2 = s2 + " Bush"; Ao manipular um String, Ao manipular um String, um novo String é gerado!um novo String é gerado! Igualdade de Strings • Para testar se dois Strings são iguais, não deve ser usado == • Deve-se usar o método equals: © 2010, Roberto S. M. Barros, Ph.D. 9 s1 == s2s1 == s2 s1.s1.equalsequals(s2)(s2) Igualdade de Strings // Cria dois novos // Cria dois novos StringsStrings String s1 = "George"; String s1 = "George"; String s2 = "George";String s2 = "George"; // Nesse momento, s1 == s2 é verdadeiro!// Nesse momento, s1 == s2 é verdadeiro! s1 = s1 + " Bush"; // Cria um novo string e o atribui para s1s1 = s1 + " Bush"; // Cria um novo string e o atribui para s1 s2 = s2 + " Bush"; // Cria um novo string e o atribui para s2s2 = s2 + " Bush"; // Cria um novo string e o atribui para s2 © 2010, Roberto S. M. Barros, Ph.D. 10 ifif (s1 == s2) (s1 == s2) SystemSystem..out.printlnout.println("s1 e s2 são os mesmos objetos");("s1 e s2 são os mesmos objetos"); elseelse SystemSystem..out.printlnout.println("s1 e s2 NÃO são os mesmos objetos");("s1 e s2 NÃO são os mesmos objetos"); ifif (s1.(s1.equalsequals(s2)) (s2)) SystemSystem..out.printlnout.println("s1 e s2 possuem o mesmo conteúdo");("s1 e s2 possuem o mesmo conteúdo"); elseelse SystemSystem..out.printlnout.println("s1 e s2 NÃO possuem o mesmo conteúdo");("s1 e s2 NÃO possuem o mesmo conteúdo"); • boolean equals (umString) • boolean equalsIgnoreCase (umString) • int length () String a = "Sharon Stone";String a = "Sharon Stone"; String b = "String b = "sharonsharon stonestone";"; Strings: Comparação e comprimento © 2010, Roberto S. M. Barros, Ph.D. 11 String b = "String b = "sharonsharon stonestone";"; int int comprimentocomprimento = = a.lengtha.length();(); boolean boolean resposta1resposta1 = = a.equalsa.equals(b);(b); boolean boolean resposta2resposta2 = = a.equalsIgnoreCasea.equalsIgnoreCase(b);(b); boolean boolean resposta3resposta3 = = b.equalsIgnoreCaseb.equalsIgnoreCase(a);(a); Qual o valor das respostas?Qual o valor das respostas? String: tratamento • String toLowerCase() • String toUpperCase() • String trim() String x = " Bom Dia! ";String x = " Bom Dia! "; © 2010, Roberto S. M. Barros, Ph.D. 12 String x = " Bom Dia! ";String x = " Bom Dia! "; String y = x.toUpperCase();String y = x.toUpperCase(); String z = x.toLowerCase();String z = x.toLowerCase(); String w = x.trim();String w = x.trim(); System.out.println(y);System.out.println(y); System.out.println(z);System.out.println(z); System.out.println(w);System.out.println(w); BOM DIA! BOM DIA! bom dia!bom dia! Bom Dia!Bom Dia! Strings: índices e substrings • int indexOf (umString) • String substring (int indiceInicio, int indiceFinal) • char charAt(int indice) Retorna um Retorna um substringsubstring de de indiceInicio até indiceFinalindiceInicio até indiceFinal--11 Índices em Java Índices em Java começam a partir de 0começam a partir de 0 © 2010, Roberto S. M. Barros, Ph.D. 13 String x = "Pernambuco";String x = "Pernambuco"; String y = x.substring(0,5);String y = x.substring(0,5); String z = x.substring(6,10);String z = x.substring(6,10); int indice = x.indexOf("na");int indice = x.indexOf("na"); char letra = x.charAt(5);char letra = x.charAt(5); System.out.println(x); System.out.println(y);System.out.println(x); System.out.println(y); System.out.println(z); System.out.println(indice);System.out.println(z); System.out.println(indice); System.out.println(letra);System.out.println(letra); Qual é a saída?Qual é a saída? Tipo Enumeração • Representa um conjunto de constantes que pertencem a uma única abstração. • O conceito foi trazido do C++, porém em Java todo tipo enum é uma classe. • Todo enum estende implicitamente da classe © 2010, Roberto S. M. Barros, Ph.D. 14 • Todo enum estende implicitamente da classe java.lang.Enum, por isso não pode estender mais nenhuma classe. • Como nos strings, Java possui um suporte especial ao tipo enum permitindo que na maior parte do tempo ele seja tratado como tipo primitivo.• Foi adicionado na versão 5.0 (Tiger) da linguagem. Tipo Enumeração • A declaração de um tipo enum é semelhante à declaração de uma classe • Os elementos devem ser separados por vírgulas publicpublic enumenum DiasDaSemanaDiasDaSemana {{ DOMINGODOMINGO,, publicpublic enumenum DiasDaSemanaDiasDaSemana {{ DOMINGODOMINGO,, © 2010, Roberto S. M. Barros, Ph.D. 15 DOMINGODOMINGO,, SEGUNDASEGUNDA,, TERCATERCA,, QUARTAQUARTA,, QUINTAQUINTA,, SEXTASEXTA,, SABADOSABADO }} DOMINGODOMINGO,, SEGUNDASEGUNDA,, TERCATERCA,, QUARTAQUARTA,, QUINTAQUINTA,, SEXTASEXTA,, SABADOSABADO }} Tipo Enumeração • Podemos usar o tipo enum como um tipo primitivo fazendo uma inicialização implícita public static void public static void mainmain (String (String argsargs) {) { DiasDaSemanaDiasDaSemana dia;dia; public static void public static void mainmain (String (String argsargs) {) { DiasDaSemanaDiasDaSemana dia;dia; © 2010, Roberto S. M. Barros, Ph.D. 16 dia = dia = DiasDaSemanaDiasDaSemana..DOMINGODOMINGO;; SystemSystem..out.printlnout.println ((“Dia escolhido: ” “Dia escolhido: ” ++ dia);dia); }} dia = dia = DiasDaSemanaDiasDaSemana..DOMINGODOMINGO;; SystemSystem..out.printlnout.println ((“Dia escolhido: ” “Dia escolhido: ” ++ dia);dia); }} Dia escolhido: DOMINGODia escolhido: DOMINGO SaídaSaída Tipo Enumeração • Como todo enum é uma classe, podemos adicionar métodos e atributos a ele. • Os enums só aceitam construtores com visibilidade private ou package (default) © 2010, Roberto S. M. Barros, Ph.D. 17 visibilidade private ou package (default) Tipo Enumeração publicpublic enumenum DiasDaSemanaDiasDaSemana {{ DOMINGO DOMINGO (2),(2), SEGUNDA SEGUNDA (1),(1), TERCA TERCA (1),(1), QUARTA QUARTA (1),(1), QUINTA QUINTA (1),(1), SEXTA SEXTA (1),(1), SABADO SABADO (1.5F);(1.5F); publicpublic enumenum DiasDaSemanaDiasDaSemana {{ DOMINGO DOMINGO (2),(2), SEGUNDA SEGUNDA (1),(1), TERCA TERCA (1),(1), QUARTA QUARTA (1),(1), QUINTA QUINTA (1),(1), SEXTA SEXTA (1),(1), SABADO SABADO (1.5F);(1.5F); Passagem de parâmetroPassagem de parâmetro ao construtorao construtor Atributo do Atributo do enumenum © 2010, Roberto S. M. Barros, Ph.D. 18 SABADO SABADO (1.5F);(1.5F); privateprivate floatfloat multiplicadorHoramultiplicadorHora;; DiasDaSemanaDiasDaSemana ( ( floatfloat multiplicadormultiplicador) {) { multiplicadorHoramultiplicadorHora = = multiplicadormultiplicador; }; } publicpublic floatfloat getMultiplicadorHoragetMultiplicadorHora () {() { returnreturn multiplicadorHoramultiplicadorHora; ; }} }} SABADO SABADO (1.5F);(1.5F); privateprivate floatfloat multiplicadorHoramultiplicadorHora;; DiasDaSemanaDiasDaSemana ( ( floatfloat multiplicadormultiplicador) {) { multiplicadorHoramultiplicadorHora = = multiplicadormultiplicador; }; } publicpublic floatfloat getMultiplicadorHoragetMultiplicadorHora () {() { returnreturn multiplicadorHoramultiplicadorHora; ; }} }} Tipo Enumeração public static void public static void mainmain (String (String argsargs) {) { floatfloat valorHoraTrabvalorHoraTrab = 20.00F;= 20.00F; floatfloat QuantidadeHorasTrabalhadasQuantidadeHorasTrabalhadas = 8F;= 8F; floatfloat valorASerRecebidovalorASerRecebido = = valorHoraTrabvalorHoraTrab ** QuantidadeHorasTrabalhadasQuantidadeHorasTrabalhadas;; DiasDaSemanaDiasDaSemana dia;dia; dia = dia = DiasDaSemanaDiasDaSemana..DOMINGODOMINGO;; System.System.out.printlnout.println ( ( “Valor a receber pelo dia: ” “Valor a receber pelo dia: ” ++ public static void public static void mainmain (String (String argsargs) {) { floatfloat valorHoraTrabvalorHoraTrab = 20.00F;= 20.00F; floatfloat QuantidadeHorasTrabalhadasQuantidadeHorasTrabalhadas = 8F;= 8F; floatfloat valorASerRecebidovalorASerRecebido = = valorHoraTrabvalorHoraTrab ** QuantidadeHorasTrabalhadasQuantidadeHorasTrabalhadas;; DiasDaSemanaDiasDaSemana dia;dia; dia = dia = DiasDaSemanaDiasDaSemana..DOMINGODOMINGO;; System.System.out.printlnout.println ( ( “Valor a receber pelo dia: ” “Valor a receber pelo dia: ” ++ Saída 1Saída 1 © 2010, Roberto S. M. Barros, Ph.D. 19 System.System.out.printlnout.println ( ( “Valor a receber pelo dia: ” “Valor a receber pelo dia: ” ++ valorASerRecebidovalorASerRecebido * * dia.getMultiplicadorHoradia.getMultiplicadorHora()() );); dia = dia = DiasDaSemanaDiasDaSemana..SEGUNDASEGUNDA;; System.System.out.printlnout.println ( ( “Valor a receber pelo dia: ” “Valor a receber pelo dia: ” ++ valorASerRecebidovalorASerRecebido * * dia.getMultiplicadorHoradia.getMultiplicadorHora()() );); }} System.System.out.printlnout.println ( ( “Valor a receber pelo dia: ” “Valor a receber pelo dia: ” ++ valorASerRecebidovalorASerRecebido * * dia.getMultiplicadorHoradia.getMultiplicadorHora()() );); dia = dia = DiasDaSemanaDiasDaSemana..SEGUNDASEGUNDA;; System.System.out.printlnout.println ( ( “Valor a receber pelo dia: ” “Valor a receber pelo dia: ” ++ valorASerRecebidovalorASerRecebido * * dia.getMultiplicadorHoradia.getMultiplicadorHora()() );); }} Valor a receber pelo dia: 320Valor a receber pelo dia: 320 Saída 2Saída 211 Valor a receber pelo dia: 160Valor a receber pelo dia: 16022 Arrays • São variáveis compostas homogêneas. – Conjunto de variáveis de um mesmo tipo e com um nome único – Para se referir a cada um dos componentes usa-se um ou mais índices. © 2010, Roberto S. M. Barros, Ph.D. 20 – Em Java, arrays têm tamanho fixo depois de criados • Muitas vezes é preciso “prever” o tamanho máximo! • Ao contrário de outras linguagens, em Java arrays também são tipos referência. Arrays • Tipos de arrays: – Unidimensionais – vetores – Bidimensionais – Matrizes – Multidimensionais • Vantagens © 2010, Roberto S. M. Barros, Ph.D. 21 • Vantagens – Evitar criar nomes diferentes para várias variáveis que contenham informações semelhantes. – Facilitar a repetição de comandos usando várias variáveis (os elementos de um array) usando os comandos de repetição, o que evita escrever várias vezes estes comandos. Declaração e criação de Arrays intint[] a;[] a; doubledouble[] x;[] x; Cliente[] clientes; Cliente[] clientes; Primeiro item: a[0]Primeiro item: a[0]Último item: a[99]Último item: a[99] © 2010, Roberto S. M. Barros, Ph.D. 22 intint[] a = [] a = newnew intint[100];[100]; String[] nomes = String[] nomes = newnew String[200];String[200]; Inicialização de Arrays int[] primosPequenos = {2, 3, 5, 7, 11, 13};int[] primosPequenos = {2, 3, 5, 7, 11, 13}; String[] cores = String[] cores = {"Vermelho", "Azul", "Amarelo"};{"Vermelho", "Azul", "Amarelo"}; © 2010, Roberto S. M. Barros, Ph.D. 23 doubledouble[][] salarios = salarios = new doublenew double[5];[5]; for (int i = 0; i<5; i++) {for (int i = 0; i<5; i++) { salarios[i] = i * 1000;salarios[i] = i * 1000; }} Arrays multidimensionais int[][] matriz;int[][] matriz; int[][] matriz = new int[10][5];int[][] matriz = new int[10][5]; for (int i=0; i<10; i++)for (int i=0; i<10; i++) for (int j=0; j<5; j++)for (int j=0; j<5; j++) Declaração não Declaração não especifica dimensõesespecifica dimensões Cria e inicializa Cria e inicializa © 2010, Roberto S. M. Barros, Ph.D. 24 for (int j=0; j<5; j++)for (int j=0; j<5; j++) matriz[i][j] = 100;matriz[i][j] = 100; long[][] x = { {0,1}, {2,3}, {4,5} };long[][] x = { {0,1}, {2,3}, {4,5} }; Cria um Cria um arrayarray de 3 por 2de 3 por 2 x[0][0]x[0][0] x[0][1]x[0][1] x[2][0]x[2][0] Cria e inicializa Cria e inicializa um um arrayarray bidimensionalbidimensional Acesso inválido • O índice pode ser qualquer expressão, desde que o resultado esteja dentro dos limites – Se é feitoacesso a um elemento indefinido de um array, é gerada uma exceção – erro fatal •• IndexOutOfBoundsExceptionIndexOutOfBoundsException © 2010, Roberto S. M. Barros, Ph.D. 25 •• IndexOutOfBoundsExceptionIndexOutOfBoundsException String nomes[] = {"José", "João", "Maria"};String nomes[] = {"José", "João", "Maria"}; SystemSystem..outout..printlnprintln(nomes[5]);(nomes[5]); Gera um erro em Gera um erro em tempo de execuçãotempo de execução Exercícios • Ler 2 vetores de tamanho N informado pelo usuário antes, some os 2 vetores e imprimir o vetor resultado. • Ler as notas de 10 alunos, calcular a média © 2010, Roberto S. M. Barros, Ph.D. 26 • Ler as notas de 10 alunos, calcular a média aritmética e imprimir as notas que sejam maiores do que a média calculada. Exercícios • Ler uma sequência de números inteiros positivos (ou zero) – A leitura deve parar com um número negativo. – Usuário digitará no máximo 1000 números. • O programa deve imprimir os números lidos cujos © 2010, Roberto S. M. Barros, Ph.D. 27 • O programa deve imprimir os números lidos cujos valores têm dois dígitos, mas na ordem inversa em que forem lidos – o último número lido deve ser o primeiro a ser impresso.