Difference between revisions of "Classes Internas (Java)/Exercício 01: Interfaces java.lang.Comparable e java.util.Comparator"

From Wiki**3

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

Revision as of 20:22, 18 October 2009

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).

Problema

  1. 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.
  2. 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).
  3. 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

<java5> </java5>