Classes Internas (Java)/Exercício 01: Interfaces java.lang.Comparable e java.util.Comparator
From Wiki**3
Problema
- Considere a tabela da Aula Prática 04. Redefina a classe como sendo comparável. Diz-se que uma tabela é menor/igual/maior que outra quando se verificar a relação menor/igual/maior entre as somas dos elementos de cada uma.
- Considere ainda o caso da alínea anterior. Defina agora dois comparadores (devem ser implementados como classes internas da tabela) que estabelecem as relações de comparação relativamente (i) aos máximos das tabelas e (ii) ao número de elementos (independentemente dos valores).
- Considere agora, em lugar de tabelas de inteiros, que as tabelas contêm gatos (classe definida acima). Altere o código da alínea 2(i) para que funcione com as tabelas de gatos.
Solução
1. Tabela comparável
Para este caso, é necessário definir a classe Table como implementando Comparable.
<java5> /**
* A table holding a fixed number of integers. * * It is possible to verify certain predicates against the table's contents. */
public class Table implements Comparable
{ /** * Space for a fixed number of integers. */ int _vector[]; /** * @param nInts * number of integers to store. */ public Table(int nInts) { _vector = new int[nInts]; } /** * FIXME: insert checks to ensure position is within range. * * @param position * position to define * @return value at position */ public int getValue(int position) { return _vector[position]; } /** * FIXME: insert checks to ensure position is within range. * * @param position * position to define * @param value * value to set */ public void setValue(int position, int value) { _vector[position] = value; } /** * Set all positions to the same value. * * @param value * value to set */ public void setAll(int value) { for (int position = 0; position < _vector.length; position++) _vector[position] = value; } /** * @param predicate * the predicate to validate. * @return true, if the predicate is valid for at least one position; false, * otherwise. */ public boolean contains(SelectionPredicate predicate) { for (int position = 0; position < _vector.length; position++) if (predicate.ok(_vector[position])) return true; return false; } /** * This method makes it easy to get the sum of all elements. As with the * predicate, this type of algorithm could also be provided from outside: * instead of a selector, a collector would have to be provided. * * @return sum of all elements. */ public int getSum() { int sum = 0; for (int i : _vector) sum += i; return sum; } /** * @see java.lang.Comparable#compareTo(java.lang.Object) */ @Override public int compareTo(Table other) { return getSum() - other.getSum(); } } </java5>2. Comparadores de Máximo e Comprimento
Notar que as classes internas são static e que apenas estão contidas na classe Table por conveniência de ocultação de código.
<java5> import java.util.Comparator;
/**
* A table holding a fixed number of integers. * * It is possible to verify certain predicates against the table's contents. */public class Table implements Comparable
3. Comparador de Tabelas de Gatos
(a publicar)
Exemplo de Aplicação
<java5> /**
* Sample uses. */
public class Application {
/** * @param args */ public static void main(String[] args) { Table t1 = new Table(3); // table with 3 integers Table t2 = new Table(3); // table with 3 integers
t1.setAll(3); t2.setAll(90);
System.out.println(t1.compareTo(t2)); // <0 System.out.println(Table.MAX_COMPARATOR.compare(t1, t2)); // <0 System.out.println(Table.MAX_COMPARATOR.compare(t1, t1)); // 0 System.out.println(Table.MAX_COMPARATOR.compare(t2, t2)); // 0 System.out.println(Table.MAX_COMPARATOR.compare(t2, t1)); // >0 System.out.println(Table.LENGTH_COMPARATOR.compare(t1, t2)); // 0 (same length)
}
} </java5> [[category:PO Exemplos]