(New page: <p>A interface <strong>Comparable<T></strong> exige às classes que a implementam a criação de um método ( <strong>T</strong> é um tipo)</p> <p st...) |
(→Problema =) |
||
Line 10: | Line 10: | ||
<p><strong>import java.util.Comparator; <br /> public class CatNameComparator implements Comparator<Cat> { <br /> public int compare(Cat cat1, Cat cat2) { <br /> return cat1.getName().compareTo(cat2.getName()); <br /> } <br /> }</strong></p> | <p><strong>import java.util.Comparator; <br /> public class CatNameComparator implements Comparator<Cat> { <br /> public int compare(Cat cat1, Cat cat2) { <br /> return cat1.getName().compareTo(cat2.getName()); <br /> } <br /> }</strong></p> | ||
<p>Recordar que a compatibilidade com <strong>equals</strong> e a simetria da comparação são como para o caso de <strong>compareTo</strong> (acima).</p> | <p>Recordar que a compatibilidade com <strong>equals</strong> e a simetria da comparação são como para o caso de <strong>compareTo</strong> (acima).</p> | ||
− | = Problema == | + | == 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 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. |
A interface Comparable<T> exige às classes que a implementam a criação de um método ( T é um tipo)
int compareTo(T other)
Este método permite estabelecer uma ordem natural sobre objectos do tipo utilizado para parametrizar a interface. Colecções desses objectos podem então ser ordenadas utilizando métodos pré-definidos (e.g., Collections.sort ou Arrays.sort).
O método compareTo deve retornar um inteiro menor que zero, zero, ou maior que zero, caso um objecto seja "menor", igual ( equals), ou "maior" que outro objecto. Como a referência null não representa nenhum objecto, se passada como argumento, não deverá ser retornado nenhum valor, devendo as implementações lançar NullPointerException. No exemplo seguite, a ordem natural é definida pela idade do gato.
public class Cat implements Comparable<Cat> {
private int _age;
private String _name;
public Gato(int age, String name) { _age = age; _name = name; }
public int getAge() { return _age; }
public String getName() { return _name; }
public int compareTo(Cat cat) {
if (cat == null) throw new NullPointerException();
return _age - cat.getAge();
}
}
Recordar que equals deve retornar false quando é passada uma referência null como argumento.
Semelhante ao uso da interface Comparable<T>, mas sem definir uma ordem natural para os objectos de uma classe, a interface Comparator<T> permite criar classes (implementações), cujos objectos representam funções de comparação entre dois objectos da classe utilizada como parâmetro do tipo do comparador. O método exigido pela interface Comparator<T> é:
int compare(T um, T outro);
O uso é análogo ao da interface Comparable<T>, mas não compromete uma classe com nenhuma função de comparação especial. Considerando o exemplo do gato, a definição seguinte permitiria, por exemplo, ordenar gatos por nome ( String implementa Comparable<String>, definindo ordem lexicográfica).
import java.util.Comparator;
public class CatNameComparator implements Comparator<Cat> {
public int compare(Cat cat1, Cat cat2) {
return cat1.getName().compareTo(cat2.getName());
}
}
Recordar que a compatibilidade com equals e a simetria da comparação são como para o caso de compareTo (acima).