(→Solução) |
|||
Line 1: | Line 1: | ||
<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>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> | ||
− | < | + | |
+ | <java5> | ||
+ | int compareTo(T other); | ||
+ | </java5> | ||
+ | |||
<p>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., <strong>Collections.sort</strong> ou <strong>Arrays.sort</strong>).</p> | <p>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., <strong>Collections.sort</strong> ou <strong>Arrays.sort</strong>).</p> | ||
<p>O método <strong>compareTo</strong> deve retornar um inteiro menor que zero, zero, ou maior que zero, caso um objecto seja "menor", igual ( <strong>equals</strong>), ou "maior" que outro objecto. Como a referência <strong>null</strong> não representa nenhum objecto, se passada como argumento, não deverá ser retornado nenhum valor, devendo as implementações lançar <strong>NullPointerException</strong>. No exemplo seguite, a ordem natural é definida pela idade do gato.</p> | <p>O método <strong>compareTo</strong> deve retornar um inteiro menor que zero, zero, ou maior que zero, caso um objecto seja "menor", igual ( <strong>equals</strong>), ou "maior" que outro objecto. Como a referência <strong>null</strong> não representa nenhum objecto, se passada como argumento, não deverá ser retornado nenhum valor, devendo as implementações lançar <strong>NullPointerException</strong>. No exemplo seguite, a ordem natural é definida pela idade do gato.</p> | ||
− | < | + | |
+ | <java5> | ||
+ | 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(); | ||
+ | } | ||
+ | } | ||
+ | </java5> | ||
+ | |||
<p>Recordar que <strong>equals</strong> deve retornar <strong>false</strong> quando é passada uma referência <strong>null</strong> como argumento.</p> | <p>Recordar que <strong>equals</strong> deve retornar <strong>false</strong> quando é passada uma referência <strong>null</strong> como argumento.</p> | ||
<p>Semelhante ao uso da interface <strong>Comparable<T></strong>, mas sem definir uma ordem natural para os objectos de uma classe, a interface <strong>Comparator<T></strong> 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 <strong>Comparator<T></strong> é:</p> | <p>Semelhante ao uso da interface <strong>Comparable<T></strong>, mas sem definir uma ordem natural para os objectos de uma classe, a interface <strong>Comparator<T></strong> 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 <strong>Comparator<T></strong> é:</p> | ||
− | < | + | |
+ | <java5> | ||
+ | int compare(T um, T outro); | ||
+ | </java5> | ||
+ | |||
<p>O uso é análogo ao da interface <strong>Comparable<T></strong>, 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 ( <strong>String</strong> implementa <strong>Comparable<String></strong>, definindo ordem lexicográfica).</p> | <p>O uso é análogo ao da interface <strong>Comparable<T></strong>, 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 ( <strong>String</strong> implementa <strong>Comparable<String></strong>, definindo ordem lexicográfica).</p> | ||
− | < | + | |
+ | <java5> | ||
+ | import java.util.Comparator; | ||
+ | public class CatNameComparator implements Comparator<Cat> { | ||
+ | public int compare(Cat cat1, Cat cat2) { | ||
+ | return cat1.getName().compareTo(cat2.getName()); | ||
+ | } | ||
+ | } | ||
+ | </java5> | ||
+ | |||
<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 == |
A interface Comparable<T> exige às classes que a implementam a criação de um método ( T é um tipo)
<java5> int compareTo(T other); </java5>
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.
<java5> 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(); }
} </java5>
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> é:
<java5> int compare(T um, T outro); </java5>
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).
<java5> import java.util.Comparator; public class CatNameComparator implements Comparator<Cat> {
public int compare(Cat cat1, Cat cat2) { return cat1.getName().compareTo(cat2.getName()); }
} </java5>
Recordar que a compatibilidade com equals e a simetria da comparação são como para o caso de compareTo (acima).
<java5> </java5>