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.