ufc ck112 10 java resolucao exercicios generics

47
 Exercicios para proxima aula 1) Implementar um contador de palavr as 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

Upload: francisco-de-castro

Post on 21-Jul-2015

290 views

Category:

Documents


0 download

TRANSCRIPT

Exercicios para proxima aula1) 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 aula2) 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 aula3) 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;

ContandoPalavrasDiferentestry { 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 Palavraspublic 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

OrdenandoExistem 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 IIpublic class WordFrequency2 { static public void main(String[] args) { Map words = new TreeMap(); } }

Frequencia de Palavras II Saidasa 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 usuarioOrdem reversa das Stringspublic 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 IIIpublic class WordFrequency3 { static public void main(String[] args) { Map words = new TreeMap(newStringComparator()); } }

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

Ordenaopublic 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 PalavrasIVpublic class WordFrequency4 { static public void main(String[] args) { 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 - Saidathe 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 c) { for (Iterator i = c.iterator(); i.hasNext(); ) if (i.next().length() == 4) i.remove(); }

Generics Tipos Genricos Quando se escreve , 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.utilpublic interface List { void add(E x); Iterator iterator(); } public interface Iterator { E next(); Boolean hasNext(); }

Bounded Wilcards Considere as seguintes declaraespublic 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 metodopublic void drawAll(List shapes) { for(Shape s: shapes) { s.draw(this); } }

Bounded Wilcards Porm o mtodo no poderia ser chamado sobre umList

Porm queremos que o mtodo aceite listas de qualquer tipo de Shapepublic void drawAll(List