UFC CK112 10 Java Resolucao Exercicios Generics
UFC CK112 10 Java Resolucao Exercicios Generics
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
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()); } }
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) {}
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> } }
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); } } }
1 1 1 1 1 1 1
O compilador sabendo o tipo da coleo, pode checar se a coleo esta sendo usada consistentemente e inserir os casts corretos
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) { ... } }
Bounded Wilcards
Porm o mtodo no poderia ser chamado sobre um
List<Circle>
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)
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
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
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 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.
System.out.println(tipo);
}
this.horaTermino = horaTermino;
this.valor = valor; } }
this.setPeriodo(periodo);
} }