Difference between revisions of "Classes Internas (Java)/Comparações em Java"

From Wiki**3

< Classes Internas (Java)
(Created page with " = Interfaces para Comparações = <p>A interface <strong>Comparable<T></strong> exige às classes que a implementam a criação de um método ( <...")
 
Line 1: Line 1:
 +
Existem em Java duas interfaces relacionadas com a comparação de objectos. A primeira, definida na package principal da linguagem, está relacionada com o conceito de ordem natural dos objectos e é, normalmente, implementada por classes cujas instâncias devem ser passíveis de comparação. A segunda interface corresponde à definição de classes para objectos que funcionam como comparadores. Neste caso, as classes não têm de ser comparáveis, já que os comparadores podem providenciar essa funcionalidade. Os comparadores surgem, por vezes, implementados como classes internas (e.g. '''String.CASE_INSENSITIVE_ORDER''') implementando a interface pública de comparação ('''java.util.Comparator''').
 +
 +
== A Interface java.lang.Comparable ==
  
= Interfaces para Comparações =
 
 
<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>
  
Line 25: Line 27:
  
 
<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>
 +
 +
== A interface java.util.Comparator ==
 +
 
<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>
  
Line 42: Line 47:
 
</java5>
 
</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>
+
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).
 +
 
 +
[[Category:Ensino]]
 +
[[Category:PO]]

Revision as of 00:50, 16 October 2013

Existem em Java duas interfaces relacionadas com a comparação de objectos. A primeira, definida na package principal da linguagem, está relacionada com o conceito de ordem natural dos objectos e é, normalmente, implementada por classes cujas instâncias devem ser passíveis de comparação. A segunda interface corresponde à definição de classes para objectos que funcionam como comparadores. Neste caso, as classes não têm de ser comparáveis, já que os comparadores podem providenciar essa funcionalidade. Os comparadores surgem, por vezes, implementados como classes internas (e.g. String.CASE_INSENSITIVE_ORDER) implementando a interface pública de comparação (java.util.Comparator).

A Interface java.lang.Comparable

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.

A interface java.util.Comparator

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