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 ( <...")
 
(A interface java.util.Comparator)
 
(10 intermediate revisions by the same user not shown)
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>
  
<java5>
+
<source lang="java">
int compareTo(T other);
+
interface Comparable<T> {
</java5>
+
  int compareTo(T other);
 +
}
 +
</source>
  
 
<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>
  
<java5>
+
<source lang="java">
 
public class Cat implements Comparable<Cat> {
 
public class Cat implements Comparable<Cat> {
 
   private int _age;
 
   private int _age;
 
   private String _name;
 
   private String _name;
   public Gato(int age, String name) { _age = age; _name = name; }
+
   public Cat(int age, String name) { _age = age; _name = name; }
 
   public int getAge() { return _age; }
 
   public int getAge() { return _age; }
 
   public String getName() { return _name; }
 
   public String getName() { return _name; }
Line 22: Line 26:
 
   }
 
   }
 
}
 
}
</java5>
+
</source>
  
 
<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>
 
  
<java5>
+
== A interface java.util.Comparator ==
int compare(T um, T outro);
+
 
</java5>
+
Semelhante ao uso da interface '''java.lang.Comparable<T>''', mas sem definir uma ordem natural para os objectos de uma classe, a interface  '''java.util.Comparator<T>''' 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. Os m&eacute;todos exigidos pela interface '''Comparator''' são os seguintes:
  
<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>
+
<source lang="java">
 +
interface Comparator<T> {
 +
  int compare(T um, T outro);
 +
  boolean equals(Object outro);
 +
}
 +
</source>
  
<java5>
+
O uso &eacute; an&aacute;logo ao da interface '''Comparable''', 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 ('''String''' implementa '''Comparable<String>''', definindo ordem lexicogr&aacute;fica).
 +
 
 +
<source lang="java">
 
import java.util.Comparator;
 
import java.util.Comparator;
 
public class CatNameComparator implements Comparator<Cat> {
 
public class CatNameComparator implements Comparator<Cat> {
Line 40: Line 50:
 
   }
 
   }
 
}
 
}
</java5>
+
</source>
 +
 
 +
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).
 +
 
 +
Note-se que a classe '''java.lang.Object''' já fornece uma implementação por omissão para '''equals''', pelo que as classes podem escolher não implementar explicitamente este método, mesmo que implementem a interface '''Comparator'''.
  
<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>
+
[[Category:Ensino]]
 +
[[Category:PO]]

Latest revision as of 15:04, 29 September 2022

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)

interface Comparable<T> {
  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 Cat(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.

A interface java.util.Comparator

Semelhante ao uso da interface java.lang.Comparable<T>, mas sem definir uma ordem natural para os objectos de uma classe, a interface java.util.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. Os métodos exigidos pela interface Comparator são os seguintes:

interface Comparator<T> {
  int compare(T um, T outro);
  boolean equals(Object outro);
}

O uso é análogo ao da interface Comparable, 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).

Note-se que a classe java.lang.Object já fornece uma implementação por omissão para equals, pelo que as classes podem escolher não implementar explicitamente este método, mesmo que implementem a interface Comparator.