0% found this document useful (0 votes)
420 views47 pages

UFC CK112 10 Java Resolucao Exercicios Generics

The document provides examples of code for counting words, calculating word frequencies, and sorting words by frequency. It discusses implementing counters for total words and unique words. Later examples show using HashMap and TreeMap to count word frequencies, and using Comparators to sort the results. The last section discusses generics, bounded wildcards, enhanced for loops, and enumerated types in Java.
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
420 views47 pages

UFC CK112 10 Java Resolucao Exercicios Generics

The document provides examples of code for counting words, calculating word frequencies, and sorting words by frequency. It discusses implementing counters for total words and unique words. Later examples show using HashMap and TreeMap to count word frequencies, and using Comparators to sort the results. The last section discusses generics, bounded wildcards, enhanced for loops, and enumerated types in Java.
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 47

Exercicios para proxima aula

1) Implementar um contador de palavras diferentes, no qual a entrada sera um conjunto de palavras digitadas no console pelo usuario e a saida sera o numero de palavras do conjunto e o numero de palavras diferentes. Dicas:
Os delimitadores sao \t\n.,:;?!/()[]\"\ Usar HashSet, BufferedReader e StringTokenizer

Exercicios para proxima aula


2) Implementar um algoritmo que calcula a frequencia das palavras digitadas no console. Dicas:
Os delimitadores sao \t\n.,:;?!/()[]\"\ Usar HashMap, BufferedReader e StringTokenizer A saida sera desta forma:
devotion years civil place gave they struggled 2 1 1 1 2 3 1

Exercicios para proxima aula


3) A mesma questao 2, mas usar TreeMap ao inves de HashMap e observar a diferenca na saida.

1 ) Contando Palavras Diferentes

public class CountWords { static public void main(String[] args) { Set words = new HashSet(); BufferedReader in = new BufferedReader( new InputStreamReader(System.in)); String delim = " \t\n.,:;?!-/()[]\"\'"; String line; int count = 0;

ContandoPalavrasDiferentes
try { while ((line = in.readLine()) != null) { StringTokenizerst = new StringTokenizer(line, delim); while (st.hasMoreTokens()) { count++; words.add( st.nextToken().toLowerCase()); } } } catch (IOExceptione) {} System.out.println("Total number of words: " + count); System.out.println("Number of different words: " + words.size()); } }

2) Frequencia das Palavras


public class Count { public Count(String word, int i) { this.word = word; this.i = i; } public String word; public int i;

Frequencia das Palavras (cont)


public class WordFrequency {
static public void main(String[] args) { Map words = new HashMap(); String delim = " \t\n.,:;?!-/()[]\"\'"; BufferedReader in = new BufferedReader( new InputStreamReader(System.in)); String line, word; Count count;

Frequencia das Palavras (cont)


try {

while ((line = in.readLine()) != null) { StringTokenizer st = new StringTokenizer(line, delim); while (st.hasMoreTokens()) { word = st.nextToken().toLowerCase(); count = (Count) words.get(word); if (count == null) { words.put(word, new Count(word, 1)); } else { count.i++; } } } } catch (IOExceptione) {}

Frequencia das Palavras (cont)


Set set = words.entrySet(); Iteratoriter = set.iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); word = (String) entry.getKey(); count = (Count) entry.getValue(); System.out.println(word + (word.length() < 8 ? "\t\t" : "\t") + count.i); } } }

Frequencia das Palavras (saida)


devotion years civil place gave they struggled ...... men remember who did work rather fathers 2 1 1 1 2 3 1 2 1 3 1 1 2 1

Ordenando
Existem duas maneiras de ordernar objetos:
Cada

classe define uma ordem natural entre suas instancias implementando a interface Comparable.
int compareTo(Object o)

Ordem

arbritarias entre diferentes objetos podem ser definidas por comparadores, classes que implementam a interface Comparator.
int compare(Object o1, Object o2)

Frequencia de Palavras II
public class WordFrequency2 { static public void main(String[] args) { Map words = new TreeMap(); <o mesmo que Word Frequency> } }

Frequencia de Palavras II Saidas


a above add address advanced ago all ...... whether which who will work world years 7 1 1 1 1 1 1 1 2 3 1 1 1 1

Ordem definida pelo usuario


Ordem reversa das Strings
public class StringComparator implements Comparator { public intcompare(Object o1, Object o2) { if (o1 != null && o2 != null && o1 instanceof String && o2 instanceof String) { String s1 = (String) o1; String s2 = (String) o2; return - (s1.compareTo(s2)); } else { return 0; } } }

Frequencia de Palavras III


public class WordFrequency3 { static public void main(String[] args) { Map words = new TreeMap(newStringComparator()); <mesmoqueWordFrequency> } }

Frequencia de Palavras - Saida

years world work will who which whether ...... all ago advanced address add above a

1 1 1 1 3 2 1 1 1 1 1 1 1 7

Ordenao
public class CountComparator implements Comparator { public intcompare(Object o1, Object o2) { if (o1 != null && o2 != null && o1 instanceof Count && o2 instanceof Count) { Count c1 = (Count) o1; Count c2 = (Count) o2; return (c2.i - c1.i); } else { return 0; } } }

Frequencia de PalavrasIV
public class WordFrequency4 { static public void main(String[] args) { <mesmoqueWordFrequency> List list = new ArrayList(words.values()); Collections.sort(list, new CountComparator()); Iteratoriter = list.iterator(); while (iter.hasNext()) { count = (Count) iter.next(); word = count.word; System.out.println(word + (word.length() < 8 ? "\t\t" : "\t") + count.i); } } }

Frequencia de Palavras IV - Saida


the that we here to a and ...... consecrate world consecrated remember did work fathers 13 12 10 8 8 7 6

1 1 1 1 1 1 1

TIPOS GENERICOS EM JAVA

Generics Tipos Genricos


Quando se obtm um objeto de um Collection, devese aplicar um cast do tipo do objeto guardado na Collection. Alm de inconveniente, isto inseguro
O compilador no checa se se o cast do mesmo tipo da coleo. O cast pode falhar em tempo de execuo.

Generics Tipos Genricos


Generics adicionam um meio de avisar ao compilador o tipo da coleo
Dessa forma ela pode ser checada.

O compilador sabendo o tipo da coleo, pode checar se a coleo esta sendo usada consistentemente e inserir os casts corretos

Generics Tipos Genricos


Exemplo simples existente no tutorial de Collecions (antigo)
// Removes 4-letter words from c. Elements must be strings static void expurgate(Collection c) { for (Iterator i = c.iterator(); i.hasNext(); ) if (((String) i.next()).length() == 4) i.remove(); }

Exemplo modificado usando generics


// Removes the 4-letter words from c static void expurgate(Collection<String> c) { for (Iterator<String> i = c.iterator(); i.hasNext(); ) if (i.next().length() == 4) i.remove(); }

Generics Tipos Genricos


Quando se escreve <Type>, leia isso com de Type
A declarao anterior pode ser lida como Coleo de Strings.

O cdigo usando generics limpo e seguro.


Elimina-se um cast inseguro e um numero de parmetros extras. Mais importante, move-se parte da especificao de um mtodo do seu comentrio para sua assinatura

Generics Tipos Genricos


Partes de cdigos existentes na definio de List e Iterator do pacote java.util
public interface List<E> { void add(E x); Iterator<E> iterator(); } public interface Iterator<E> { E next(); Boolean hasNext(); }

Bounded Wilcards
Considere as seguintes declaraes
public abstract class Shape { public abstract void draw(Canvas c); } public class Circle extends Shape { private int x, y, radius; public void draw(Canvas c) { ... } } public class Rectangle extends Shape { private intx, y, width, height; public void draw(Canvas c) { ... } }

Podemos definir o seguinte metodo


public void drawAll(List<Shape> shapes) { for(Shape s: shapes) { s.draw(this); } }

Bounded Wilcards
Porm o mtodo no poderia ser chamado sobre um
List<Circle>

Porm queremos que o mtodo aceite listas de qualquer tipo de Shape


public void drawAll(List<? extends Shape> shapes) { ... }

Enhanced for Loop for each


Esta nova construo da linguagem elimina a necesidade do Iterators (sujos e causadores de erros) ao iterar sobre colees e arrays. [JSR 201] Considere o seguinte metodo que recebe uma coleo de TimerTask e as cancela
void cancelAll(Collection<TimerTask> c) { for (Iterator<TimerTask> i = c.iterator(); i.hasNext(); ) i.next().cancel(); }

A variavel do iterator aparece 3 veses em cada loop


Isto significa 2 chances de fazer besteira

Enhanced for Loop for each


A contruo do for each elimina a confuso e as oportunidades de erros. Observe o exemplo de como usar o for each:
void cancelAll(Collection<TimerTask> c) { for (TimerTask t : c) t.cancel(); }

Quando se escreve dois pontos (:) leia-se como em ou de


No loop acima: para cada TimerTask t em c.

Se combina de forma limpa com generics

Enhanced for Loop for each


Um erro comum ao usar Iterators
List suits = ...; List ranks = ...; List sortedDeck = new ArrayList(); // BROKEN - throws NoSuchElementException! for (Iterator i = suits.iterator(); i.hasNext(); ) for (Iterator j = ranks.iterator(); j.hasNext(); ) sortedDeck.add(new Card(i.next(), j.next()));

Algum consegue ver o bug? Muitos desenvolvedores experientes cometem este erro uma vez ou outra O problema que o metodo next chamado muitas vezes na coleo de fora (suits)

Enhanced for Loop for each


Para consertar o erro preciso declarar uma variavel no escopo do loop de fora
// Fixed, though a bit ugly for (Iterator i = suits.iterator(); i.hasNext(); ) { Suit suit = (Suit) i.next(); for (Iterator j = ranks.iterator(); j.hasNext(); ) sortedDeck.add(new Card(suit, j.next())); }

O que isso tem a ver com o for each?


for (Suit suit : suits) for (Rank rank : ranks) sortedDeck.add(new Card(suit, rank));

Enhanced for Loop for each


Ainda pode ser usado com arrays
// Returns the sum of the elements of a int sum(int[] a) { int result = 0; for (int i : a) result += i; return result; }

Enhanced for Loop for each


Use for each sempre que puder
Melhora a simplicidade e a qualidade do cdigo

Observe que for eachs so usados apenas em iteraes onde no se deseja remover ou substituir os elementos da coleo

Tipos enumerados
Antiga forma de representar tipos enumerados
public class PlayingCard { public static final int SUIT_CLUBS = 0; public static final int SUIT_DIAMONDS = 1; public static final int SUIT_HEARTS = 2; public static final int SUIT_SPADES = 3; ... }

At a verso 1.4 - constantes estticas inteiras Ex: cores, dias da semana, tipos de produtos, status de pedidos e outros, dados que geralmente esto associados a uma classe e no esto persistidos.

Typesafe Enums Tipos enumerados


No java5 foi criado um novo tipo de dado denominado enumerao(enum). Este novo tipo garante o uso de valores pertencentes a um conjunto pr-definido, ou seja, garante o uso de tipos seguros, da tambm ser conhecido por type-safe enumeration.

Typesafe Enums
Enum tambm uma classe. Enum usa constantes, ou seja letras maisculas, Exemplo: PESSOA_JURIDICA. Um construtor de enum s pode apresentar os modificadores default e private. Enum um tipo especial de classe, posso criar classe dentro de classe. So classes que herdam da classe java.lang.enum

Os mtodos mais teis so provavelmente os seguintes trs: toString() valueOf() ordinal()

Para declarar uma enumerao utiliza-se a palavra-chave enum seguida do nome desejado e seguindo a conveno de nomes das classes(iniciando com maiscula). public class Cliente { public enum TipoCliente{ PESSOA_FISICA, PESSOA_JURIDICA }; private TipoCliente tipo; private String nome; private String email; }

public class TesteClienteEnumeracao {


public static void main(String[] args) { Cliente c = new Cliente("Carlos", "carlos@gc.com.br", Cliente.TipoCliente.PESSOA_FISICA); System.out.println("Tipo de cliente criado = "+c.getTipo()); } }

public enum Mes { JANEIRO, FEVEREIRO, MARCO, ABRIL, MAIO, JUNHO, JULHO, AGOSTO, SETEMBRO, OUTUBRO, NOVEMBRO, DEZEMBRO

private static boolean mesFeriasEscolares(Mes mes){ switch (mes){ case DEZEMBRO: case JANEIRO: case FEVEREIRO: case JULHO: return true; default: return false; }
}

No precisa instanciar um objeto para enum, para chamar um atributo da classe enum deve seguir a regra de atributos estticos. Exemplo: nomeDaClasse.atributo
Mes ms = Mes.JANEIRO Obs: no utiliza a palavra reservada new; pois no est instanciando um novo objeto.

Imprimindo elementos enum


Mtodo esttico values() - retorna um array com os elementos da enumeraes na mesma ordem em que foram declarados. Para imprimir usar um enhanced for .

Imprimindo elementos enum


Cliente c = new Cliente("Carlos", "carlos@gc.com.br", Cliente.TipoCliente.PESSOA_FISICA);
System.out.println("Tipo de cliente"); for(Cliente.TipoCliente tipo : Cliente.TipoCliente.values()){

System.out.println(tipo);
}

Adicionando atributos e mtodos


public enum Periodo {
DIURNO_INTEGRAL ("seg a sex", 10, 18, 3.000), DIURNO_MATUTINO("seg a sex", 8,12, 3.000), NOTURNO("seg a sex", 19,23, 3.000), MAIS_DIAS("sabado e domingo", 10, 19, 3.000); private String dias; private double valor; private int horaTermino; private int horaInicio; Periodo(String dias, int horaInicio, int horaTermino, double valor){ this.dias = dias; this.horaInicio = horaInicio;

this.horaTermino = horaTermino;
this.valor = valor; } }

public class Turma { private String curso; private Periodo periodo;

public Turma(String curso, Periodo periodo){


this.setCurso(curso);

this.setPeriodo(periodo);
} }

public class TesteTurma {


public static void main(String[] args) { Turma t = new Turma("Curso java", Periodo.MAIS_DIAS); // selecione aqui a Constante System.out.println("Curso : "+t.getCurso()); System.out.println("Dias : "+t.getPeriodo().getDias()); System.out.println("Hora inicio : "+t.getPeriodo().getHoraInicio()); System.out.println("Hora termino : "+t.getPeriodo().getHoraTermino()); System.out.println("Valor : "+t.getPeriodo().getValor()); } }

You might also like