Projeto V (U900005) – Ciências da Computação Projeto II (U900003) – Engenharia da Computação Prof. Valdir Gil Pillat 2. Strings Veja alguns métodos utilizados na classe String retorno = x.equals(y); // Compara strings, retorna (True/False) retorno = x.equalsIgnoreCase(y); // Compara Strings ignorando maiúsculas e minúsculas, retorna (True/False) retorno = x.compareTo(y) // Compara Strings e retorna à diferença entre o tamanho das Strings y = x.replace(caracterVelho, caracterNovo);//Substitui um caractere por outro Y = x.toLowerCase(); // Substitui os caracteres maiúsculos pelo mesmo minúsculos Y = x.toUpperCase(); // Substitui os caracteres minúsculos pelo mesmo maiúsculos Z = X.concat(y); // Junta duas ou mais strings. R = A.concat(B).concat(C).concat(D); Y = X.trim(); // retira os espaços iniciais e finais da String Y = X.substring(inicio); //Y recebe a substring X do ponto inicial (inicio) até o fim da String Y = X.substring(inicio, final); //Y recebe a substring X do ponto inicial (inicio) até o ponto final (final) Índice = A.indexOf(B); // retorna a posição da primeira ocorrência da string B na String A. Índice = A.indexOf(B, inicio); // retorna a posição da primeira ocorrência da string B a partir do ponto inicial (inicio) da String A. Índice = A.lastIndexOf(B); //retorna a posição da última ocorrência da string B na String A. Índice = A.lastIndexOf(B, inicio); // retorna a posição da última ocorrência da string B a partir do ponto inicial (inicio) da String A. começa = A.startsWith(B); //retorna True se a String A começa com a String B. termina = A.endsWith(B); //retorna True se a String A termina com a String B. caracter = A.charAt(posição); // retorna o caracter na posição indicada tamanho = A.length (); // retorna o tamanho da String 3. Arrays Arrays ou Vetores são estruturas de dados que me permitem guardar vários valores do mesmo tipo em uma única variável, e identificá-los por um índice. Para criação de arrays devemos declarar o array e depois alocar memória para ele. tipo_array nome_array[]; //Declaração nome_array = new tipo_array[tamanho_array]; //Alocação de memória tipo_array nome_array = new tipo_array[tamanho_array]; //Tudo em uma linha Obs.: Os arrays em Java inicial sempre com índice zero. Arrays multidimensionais são declarados da seguinte forma: double x[][] = new double[100][50]; 19/08/2005 http://www.fcc.univap.br/~valdir e-mail: [email protected] 1 Projeto V (U900005) – Ciências da Computação Projeto II (U900003) – Engenharia da Computação Prof. Valdir Gil Pillat Exemplo de Arrays de Instâncias de Classe class alunoSimples{ int idade; String nome; alunoSimples(){ } void lê_dados() { System.out.print(“ Entre com o nome do aluno: ”); nome = Keyboard.readString(); System.out.print(“ Entre a idade do aluno: ”); idade = Keyboard.readInt(); } void imprimir(){ System.out.println(“Aluno ”+nome+“ idade ”+ idade);} } class demoArray{ public static void main (String args[]){ alunoSimples turma[] = new alunoSimples[10]; //turma de 10 alunos for(int i=0;i<10;i++){ turma[i] = new alunoSimples(); //aloca memória para um aluno turma[i].lê_dados(); }//fim for }//fim main }//fim class 4. Funções Matemáticas O pacote java.lang.Math contêm várias constantes e métodos para cálculos matemáticos. Não é necessária a criação de instâncias da classe para poder usá-la. As duas constantes na classe Math são Math.E (base de logaritmos naturais) e Math.PI (valor de PI). Alguns métodos úteis da classe Math são: abs - retorna valor absoluto (somente positivo); x= Math.abs(y); max – retorna o maior valor entre dois valores; x= Math.max(a,b); min – retorna o menor valor entre dois valores; x= Math.min(a,b); round – arredonda um valor decimal; x = Math.round(a); floor – arredonda para baixo; x= Math.floor(a); ceil – arredonda para cima; x= Math.ceil(a); log – calcula log (base e); x= Math.log(a); exp – calcula exponencial; x= Math.exp(a); sin – calcula o seno; x = Math.sin(a); cos – calcula o cosseno; x = Math.cos(a); tan –calcula a tangente; x = Math.tan(a); sqrt - calcula a raiz quadrada; x = Math.sqrt(a); pow – calcula potencia; x = Math.pow(a,b); random – gera valores aleatórios entre 0 e 1 (inclusive); x = Math.random(); 19/08/2005 http://www.fcc.univap.br/~valdir e-mail: [email protected] 2 Projeto V (U900005) – Ciências da Computação Projeto II (U900003) – Engenharia da Computação Prof. Valdir Gil Pillat Métodos de conversão de String Alguns métodos podem ser utilizados para converter Strings em valores nativos do Java: X=Integer.parseInt(A); //onde X é int e A é String Existem métodos similares nas classes Byte, Long e Short Interessante: System.currentTimeMillis(); // retorna o tempo em milissegundos 5. Manipulação de arquivos Outro dispositivo de entrada e saída de vital importância é disco, manipulado pelo sistema operacional e por linguagens de programação através do conceito de arquivos. Um arquivo é uma abstração utilizada por sistemas operacionais para uniformizar a interação entre o ambiente de execução e os dispositivos externos a ele em um computador. Tipicamente, a interação de um programa com um dispositivo através de arquivos passa por três etapas: abertura ou criação de um arquivo; transferência de dados; e fechamento do arquivo. Em Java, a classe File permite representar arquivos nesse nível de abstração. Um dos construtores desta classe recebe como argumento uma string que pode identificar, por exemplo, o nome de um arquivo em disco. Os métodos desta classe permitem obter informações sobre o arquivo. Por exemplo, exists() permite verificar se o arquivo especificado existe ou não; os métodos canRead() e canWrite() verificam se o arquivo concede a permissão para leitura e escrita, respectivamente; length() retorna o tamanho do arquivo e lastModified(), o tempo em que ocorreu a última modificação (em milissegundos desde primeiro de janeiro de 1970). Outros métodos permitem ainda realizar operações sobre o arquivo como um todo, tais como delete() e deleteOnExit(). Observe que as funcionalidades de transferência seqüencial de dados a partir de ou para um arquivo não é suportada pela classe File, mas sim pelas classes FileInputStream, FileOutputStream, FileReader e FileWriter. Todas estas classes oferecem pelo menos um construtor que recebe como argumento um objeto da classe File e implementam os métodos básicos de transferência de dados suportados respectivamente por InputStream, OutputStream, Reader e Writer. Para aplicações que necessitam manipular arquivos de forma não seqüencial (ou “direta”), envolvendo avanços ou retrocessos arbitrários na posição do arquivo onde ocorrerá a transferência, Java oferece a classe RandomAccessFile. Esta não é derivada de File, mas oferece um construtor que aceita como argumento de especificação do arquivo um objeto dessa classe. Outro construtor recebe a especificação do arquivo na forma de uma string. Para ambos construtores, um segundo argumento é uma string que especifica o modo de operação, “r” para leitura apenas ou “rw” para leitura e escrita. Os métodos para a manipulação da posição corrente do ponteiro no arquivo são seek(long pos), que seleciona a posição em relação ao início do arquivo para a próxima operação de leitura ou escrita, e getFilePointer(), que retorna a posição atual do ponteiro do arquivo. Além disso, o método length() retorna o tamanho do arquivo em bytes. Para a manipulação de conteúdo do arquivo, todos os métodos especificados pelas interfaces DataInput e DataOutput são implementados por essa classe. Assim, é possível por exemplo usar os métodos readInt() e writeInt() para ler e escrever valores do tipo primitivo int, respectivamente. 19/08/2005 http://www.fcc.univap.br/~valdir e-mail: [email protected] 3 Projeto V (U900005) – Ciências da Computação Projeto II (U900003) – Engenharia da Computação Prof. Valdir Gil Pillat Exemplo simples Leitura de texto import java.io.* class demofile { public static void main (String args[]) { String arquivo = “teste.dat”; try { FileReader fr = new FileReader(arquivo); BufferedReader br = new BufferedReader(fr); boolean aindatemmais = true; while (aindatemmais == true) { String linha = br.readLine(); //Lê uma linha if (linha == null) aindatemmais = false; else System.out.println(linha); } //fim do while br.close(); } catch (IOException e) { System.out.println( “Erro ! Não é possível ler o arquivo ” + arquivo); System.exit(1); }//fim catch }//fim main }//fim class Exemplo simples gravação de texto import java.io.* class demofile { public static void main (String args[]) { String arquivo = “fatoriais.dat”; try { FileWriter fw = new FileWriter(arquivo); BufferedWriter br = new BufferedWriter(fr); double factorial = 1; for (int f=1;f<200;f++) { fatorial *= f; 19/08/2005 http://www.fcc.univap.br/~valdir e-mail: [email protected] 4 Projeto V (U900005) – Ciências da Computação Projeto II (U900003) – Engenharia da Computação Prof. Valdir Gil Pillat bw.write ( “O fatorial de ”+f+ “ é ”+ fatorial); bw.newLine(); } bw.close(); } catch (IOException e) { System.out.println( “Erro ! Não é possível ler o arquivo ” + arquivo); System.exit(1); }//fim catch }//fim main }//fim class Exemplo simples Leitura de texto utilizando RandomAccessFile import java.io.* class demofile { public static void main (String args[]) { String arquivo = “teste.dat”; try { RandomAccessFile file = new RandomAccessFile(arquivo, “r”); boolean aindatemmais = true; while (aindatemmais == true) { String linha = file.readLine(); //Lê uma linha if (linha == null) aindatemmais = false; else System.out.println(linha); } //fim do while file.close(); } catch (IOException e) { System.out.println( “Erro ! Não é possível ler o arquivo ” + arquivo); System.exit(1); }//fim catch }//fim main }//fim class 19/08/2005 http://www.fcc.univap.br/~valdir e-mail: [email protected] 5 Projeto V (U900005) – Ciências da Computação Projeto II (U900003) – Engenharia da Computação Prof. Valdir Gil Pillat Exercícios. 1. Faça um programa em Java que fique lendo uma string do teclado enquanto o tamanho desta string for menos que 10 caracteres. 2. Faça um programa em Java que substitua todas as vogais de uma string pelo caracter “?”. 3. Faça um programa em Java que conte quantas ocorrências de um determinado caracter em uma string. 4. Reescreva o exemplo de leitura de arquivo simples para que o nome do arquivo seja passado via teclado. 5. Procure uma palavra dentro do arquivo. Dica: Utilize o método indexOf(). 6. Leia um arquivo e guarde em um array. 7. Modifique o exercício 6 para armazenar pedaços da linha em arrays multidimensionais. 8. Modifique os exercícios 5 e 6 utilizando a classe StringTokenizer 19/08/2005 http://www.fcc.univap.br/~valdir e-mail: [email protected] 6 Projeto V (U900005) – Ciências da Computação Projeto II (U900003) – Engenharia da Computação Prof. Valdir Gil Pillat Apêndice Aula 2 Sobre a classe StringTokenizer Em alguns exemplos e exercícios anteriores fizemos a quebra de Strings em posições definidas (por exemplo, pegando de uma String os caracteres de 0 a 9, etc). Isto só pode ser feito quando temos certeza de onde estão as divisões dos elementos na String. Por exemplo, para separar a String 32980018 07.3 08.3 10.0 07.0 nos seus componentes (que podem ser processados posteriormente), precisamos saber a localização exata dos espaços divisores. Um erro de localização e podemos ter problemas com o processamento posterior. Em algumas aplicações de processamento de textos e Strings, informação é codificada de maneira diferente: ao invés de separar dados usando posições definidas, caracteres específicos (chamados de tokens ) são usados como separadores. A String mostrada acima como exemplo poderia ser codificada usando vírgulas como separadores: 32980018,7.3,8.3,10,7. Neste caso, a separação da String em seus componentes não poderia ser feita usando posições pré-definidas. A classe StringTokenizer permite a quebra de uma string em seus tokens, independente da posição dos separadores. A classe StringTokenizer tem construtores que recebem como argumentos as Strings a serem processadas e métodos para criar e contar os tokens. Os construtores e métodos da classe StringTokenizer são: * StringTokenizer(String orig): Cria uma instância da classe StringTokenizer que vai quebrar a String orig em seus componentes, separados por espaços (implicitamente). Os espaços serão eliminados das Strings resultantes. * StringTokenizer(String orig,String separadores): Cria uma instância da classe StringTokenizer que vai quebrar a String orig em seus componentes, separados pelos caracteres na String separadores de forma que qualquer caracter na String separadores servirá como separador. Estes caracteres serão eliminados das Strings resultantes. * StringTokenizer(String orig,String separadores,boolean inclui): Cria uma instância da classe StringTokenizer que vai quebrar a String orig em seus componentes, separados pelos caracteres na String separadores da mesma forma que o construtor anterior. O valor booleano adicional inclui será usado para decidir se os separadores também serão incluidos na lista de Strings resultantes. * countTokens(): retorna o número de tokens que existem na instância de StringTokenizer. * hasMoreTokens(): retorna um valor booleano que indica se existem mais Tokens na instância de StringTokenizer. * nextToken(): retorna o próximo token da instância de StringTokenizer como uma String. Os tokens são retornados como uma fila de Strings: somente o próximo token da fila pode ser lido, e depois de lido é eliminado da fila, como mostrado abaixo para a String exemplo 32980018,7.3,8.3,10,7: 19/08/2005 http://www.fcc.univap.br/~valdir e-mail: [email protected] 1 Projeto V (U900005) – Ciências da Computação Projeto II (U900003) – Engenharia da Computação Prof. Valdir Gil Pillat Passo Lista de Strings String lida Lista Resultante 1 [32980018 7.3 8.3 10 7] 32980018 [7.3 8.3 10 7] 2 [7.3 8.3 10 7] 7.3 [8.3 10 7] 3 [8.3 10 7] 8.3 [10 7] 4 [10 7] 10 [7] 5 [7] 7 [] (a lista vazia) Quando a lista estiver vazia, o valor retornado por hasMoreTokens() será false. Depois que um token é lido da instância de StringTokenizer, não pode ser recolocado na lista. Os programas abaixo ilustram exemplos da classe StringTokenizer. Listagem 10. Programa que demonstra a classe StringTokenizer 1 // A linha abaixo é necessária para o uso da classe StringTokenizer 2 import java.util.*; 3 4 // Uma classe para demonstrar a classe StringTokenizer 5 class demoTokens 6 { 7 public static void main(String args[]) 8 { 9 // Uma String para teste 10 String test = "Isto é um teste"; 11 // A partir da String crio um StringTokenizer, separando os 12 // tokens por espaços (implicitamente) 13 StringTokenizer st = new StringTokenizer(test); 14 // quantos tokens eu tenho na String ? 15 int quantosTokens = st.countTokens(); 16 System.out.println("Número de tokens:"+quantosTokens); 17 // vamos ver quais são os tokens ? 18 for(int cont=0;cont<quantosTokens;cont++) 19 { 20 System.out.println(st.nextToken()); 21 } 22 // Outra String para teste 23 String outroTest = "um, dois, três, quatro, cinco, seis, sete, oito"; 24 // A partir da String crio um StringTokenizer, separando os 25 // tokens por vírgulas (explicitamente) 26 StringTokenizer outroSt = new StringTokenizer(outroTest,","); 27 // quantos tokens eu tenho na String ? 28 quantosTokens = outroSt.countTokens(); 29 System.out.println("Número de tokens:"+quantosTokens); 30 // vamos ver quais são os tokens ? 31 for(int cont=0;cont<quantosTokens;cont++) 32 { 33 System.out.println(outroSt.nextToken()); 34 } 35 } // fim do método main 36 } // fim da classe 19/08/2005 http://www.fcc.univap.br/~valdir e-mail: [email protected] 2