comparable comparator interfaces java
Este tutorial explica o conceito de interfaces comparáveis e comparadoras em Java com exemplos. Você também aprenderá sobre as diferenças entre os dois:
Aprendemos tudo sobre interfaces em nossos tutoriais anteriores. Uma interface é usada para declarar métodos abstratos e variáveis estáticas ou finais. Por padrão, os métodos de interface são públicos. Desde o Java 8, as interfaces também podem ter métodos estáticos e padrão definidos nelas.
Java fornece várias interfaces integradas que podemos usar para realizar várias operações. Neste tutorial, discutiremos duas dessas interfaces, ou seja, Comparable e Comparator. Uma interface comparável é usada para classificar objetos de acordo com a ordem natural. A interface de comparação é usada para classificar atributos individuais de vários objetos.
=> Explore a série de treinamento simples em Java aqui.
Vamos começar com uma interface comparável.
O que você aprenderá:
- Interface comparável em Java
- Interface de comparação em Java
- Diferença entre comparador vs. comparador
- Conclusão
Interface comparável em Java
A interface comparável classifica as estruturas de lista como Arrays e ArrayLists contendo objetos personalizados. Depois que os objetos de lista implementam a interface Comparable, podemos usar o método Collections.sort () ou Arrays.sort () no caso dos arrays para classificar o conteúdo.
Mas quando temos classes personalizadas e precisamos classificar seus objetos, teremos que implementar a interface Comparable nesta classe. A interface Comparable faz parte do java.lang pacote. Essa interface possui apenas um método, CompareTo (). Usando uma interface comparável, podemos classificar um único membro de dados por vez.
Por exemplo, se tivermos nome e idade como campos em nossa classe, em um momento podemos classificar os objetos de classe por nome ou idade. Não podemos classificar simultaneamente por nome e idade.
Conforme explicado acima, podemos implementar a interface Comparable em Java tendo uma classe customizada para implementar a interface Comparable. A interface Comparable tem apenas um método ‘compareTo’ que deve ser substituído na classe para classificar os objetos personalizados.
Método ‘CompareTo’
O método ‘compareTo’ da interface Comparable é usado para comparar o objeto atual com o objeto fornecido. A sintaxe geral do objeto compareTo é fornecida a seguir.
public int compareTo (Object obj)
Conforme mostrado acima, o método compareTo aceita um objeto como um argumento (pode ser qualquer objeto personalizado) e o compara com o objeto atual usado para invocar este método.
O método compareTo retorna um valor inteiro que pode ter um dos seguintes valores:
- Positivo (> 0) inteiro => o objeto atual> o parâmetro do objeto passado.
- Negativo (o objeto atual
- Zero (= 0) => o objeto atual e o objeto especificado são iguais.
Podemos usar o método compareTo () para classificar:
- Objetos do tipo string
- Objetos de classe Wrapper
- Objetos definidos pelo usuário ou personalizados
Agora vamos implementar um exemplo de interface comparável.
Exemplo de interface comparável
O programa Java a seguir implementa uma classe Person que contém nome e idade como campos de membro. Esta classe implementa uma interface ‘Comparable’ que nos permitirá classificar o objeto da classe Person.
Observe que, como iremos classificar objetos personalizados, precisamos substituir o método ‘compareTo ()’ da interface Comparable.
como testar um site com caneta
Dentro do método compareTo () sobrescrito, comparamos a idade do objeto pessoa que é passada com a do objeto atual e, consequentemente, retornamos o valor.
Um exemplo de programa Java é fornecido abaixo.
//class person implementing Comparable interface class Person implements Comparable { private String name; private int age; //Person constructor public Person(String name, int age) { this.name = name; this.age = age; } //getter methods for Person members public int getAge() { return this.age; } public String getName() { return this.name; } //override toString () method @Override public String toString() { return ''; } //Override compareTo () method to compare age of two Person objects @Override public int compareTo(Person per) { if(this.age == per.age) return 0; else return this.age > per.age ? 1 : -1; } } public class Main{ public static void main(String() args) { //declare two objects of Person class Person p1 = new Person('Adrian', 24); Person p2 = new Person('Eddie', 26); int ageDiff = p1.compareTo(p2); //compare ages of two persons declared switch(ageDiff) { case -1: { System.out.println(p2.getName() + ' is older than ' + p1.getName()); break; } case 1: { System.out.println(p1.getName() + ' is older than ' + p2.getName()); break; } default: System.out.println(p1.getName () + ' and ' + p2.getName () + ' are of the same age!'); } } }
Resultado:
Como visto na saída, usamos uma interface Comparable para comparar dois objetos da classe Person com base na variável de membro age.
Como o nome sugere, uma interface Comparable nos permite comparar um objeto com o outro, desde que os objetos sejam do mesmo tipo. Contanto que os objetos saibam se organizar, podemos classificar os objetos facilmente usando o único método ‘compareTo ()’ que pertence a esta interface.
Método Java String CompareTo ()
Também podemos usar o método compareTo () para comparar dois objetos do tipo String em Java. Os dois objetos string são comparados lexicograficamente convertendo cada caractere do objeto string em seu caractere Unicode equivalente.
Se duas strings forem iguais, 0 será retornado. Se o primeiro objeto for maior que o segundo objeto, um valor positivo será retornado e um valor negativo será retornado se o primeiro objeto string for menor que o segundo objeto String.
Por exemplo,
string1.compareTo (string2) irá comparar string1 e string 2 lexicograficamente.
public class Main { public static void main(String args()) { //declare and print string objects String str1 = 'SoftwareTestingHelp'; String str2 = 'Java Series tutorial'; String str3 = 'Comparable Interface'; System.out.println('str1:' + str1); System.out.println('str2:' + str2); System.out.println('str3:' + str3); //compare strings and print the results. int retval1 = str1.compareTo( str2 ); System.out.println('
str1 & str2 comparison: '+retval1); int retval2 = str1.compareTo( str3 ); System.out.println('str1 & str3 comparison: '+retval2); int retval3 = str2.compareTo('compareTo method'); System.out.println('str2 & string argument comparison: '+retval3); } }
Resultado:
No programa acima, vimos como usar o método compareTo () para comparar duas strings. Antes disso, usamos o método compareTo () para comparar os valores inteiros (idade por exemplo). Da mesma forma, podemos usar os outros tipos de dados como doubles com o método compareTo ().
Agora, vamos passar para a interface Comparator em Java.
Interface de comparação em Java
Já vimos o funcionamento da interface Comparable. A interface comparável nos permite classificar objetos personalizados com base em um único membro de dados. Mas quando surge a necessidade de classificar o objeto com base em vários campos ou membros de dados, podemos optar por uma interface de comparação.
Usando a interface Comparator, podemos criar mais de um comparador, dependendo de quantos campos desejamos usar para classificar os objetos personalizados. Usando a interface do comparador, supondo que desejamos classificar o objeto personalizado em dois campos de membro nome e idade, precisamos ter dois comparadores, um para nome e outro para idade.
Então, podemos chamar o método Collections.sort () com esses comparadores.
Então, como exatamente podemos escrever os comparadores?
Considere um exemplo de um aluno da classe com nome e idade como seu campo. Considere que queremos classificar os objetos Student nos campos de nome e idade.
Para isso, primeiro teremos que escrever classes Comparator, StudentAgeComparator e StudenNameComparator. Nessas classes, substituiremos o método compare () da interface Comparator e, em seguida, chamaremos o método Collections.sort usando cada um desses comparadores para classificar os objetos dos alunos.
A interface do comparador contém um objeto ‘compare’ que é usado para comparar objetos de duas classes diferentes. A sintaxe geral do método de comparação é:
public int compare (Object obj1, Object obj2);
O método compare compara obj1 com obj2.
A interface do Comparator faz parte do java.util pacote e além do método de comparação; ele também contém outro método denominado equals.
Exemplo de comparação de Java
Vamos implementar um exemplo de comparação em Java. Novamente, pegamos uma classe de aluno com nome e idade como membros de dados. Em seguida, definimos uma classe comparadora AgeComparator que substitui o método compare para comparar as idades de dois alunos e retornar os valores apropriados.
No método principal, construímos uma Arraylist de objetos Student. Em seguida, chamamos o método Collections.sort com os objetos ArrayList e AgeComparator como argumentos. Isso classifica os objetos de Aluno de acordo com a idade.
O programa Java que implementa este cenário é fornecido abaixo.
import java.util.*; //class student whose objects are to be sorted class Student{ int rollno; String name; int age; Student(int rollno,String name,int age){ this.rollno=rollno; this.name=name; this.age=age; } } //AgeComparator class implementing Comparator to compare objects class AgeComparator implements Comparator { public int compare(Object o1,Object o2){ Student s1=(Student)o1; Student s2=(Student)o2; if(s1.age==s2.age) return 0; else if(s1.age>s2.age) return 1; else return -1; } } class Main{ public static void main(String args()){ //create an ArrayList of Students ArrayList myList=new ArrayList(); myList.add(new Student(101,'Adrian',25)); myList.add(new Student(106,'Sydney',22)); myList.add(new Student(105,'Marcus',27)); //call Collections.sort method with AgeComparator object to sort ArrayList Collections.sort(myList,new AgeComparator()); System.out.println('Sorted Student objects by Age are as follows:'); Iterator iter= myList.iterator(); while(iter.hasNext()){ Student st=(Student) iter.next(); System.out.println(st.rollno+' '+st.name+' '+st.age); } } }
Resultado:
No programa acima, semelhante à maneira como escrevemos AgeComparator para classificar os objetos Student com base na Age, também podemos escrever outro NameComparator para classificar os objetos Student com base no campo de nome.
Dessa forma, podemos ter quantas classes Comparator forem necessárias para classificar objetos em vários campos. Da maneira como comparamos duas variáveis int, também podemos comparar variáveis de outros tipos de dados usando o método Compare.
Diferença entre comparador vs. comparador
Interface Comparável | Interface de comparação |
---|---|
Usa Collections.sort (List) para classificar os elementos. | Usa Collections.sort (List, Comparator) para classificar os elementos. |
A interface comparável fornece classificação de campo único. | A interface do comparador fornece classificação de vários campos. |
A interface comparável classifica o objeto de acordo com a ordem natural. | A interface do comparador classifica vários atributos de objetos diferentes. |
Usando uma interface comparável, podemos comparar o objeto atual ‘this’ com o objeto especificado. | Usando uma interface de comparador, podemos comparar objetos de diferentes classes. |
Parte do pacote java.lang. | Parte do pacote java.util. |
O uso de uma interface Comparable modifica a classe real. | O comparador não altera a classe original. |
Fornece o método compareTo () para classificar os elementos. | Fornece método compare () para classificar elementos. |
perguntas frequentes
P # 1) É comparável uma interface funcional?
Responda: Sim, comparável é uma interface funcional. Ele declara um único método abstrato, compareTo ().
P # 2) Como você torna uma classe comparável?
Responda: Tornamos uma classe comparável implementando a interface Comparable. Dentro da classe, substituímos o método compareTo () para classificar o objeto. Passamos um objeto e o comparamos com o objeto atual.
O método compareTo () retorna 0 se dois objetos forem iguais. Ele retorna um número negativo se o primeiro objeto for menor que o segundo e positivo se o primeiro objeto for maior que o segundo objeto.
P # 3) Qual é o objetivo principal da interface do Comparator?
Responda: A interface de comparação é usada principalmente para classificar os objetos personalizados. Uma interface de comparador também pode ser usada para comparar objetos de classes diferentes. Além disso, a interface do comparador pode ser usada para classificar objetos em vários campos.
P # 4) Por que o Comparator é usado em Java?
Responda: A interface de comparação é usada principalmente quando queremos uma ordem de classificação diferente para nossos objetos personalizados, além da ordem natural com base em vários campos.
P # 5) O que implementa a interface Comparable?
Responda: A interface comparável é implementada por todas as classes de wrapper e classe String. Os objetos personalizados também usam a interface comparável para classificação.
Conclusão
Neste tutorial, discutimos interfaces comparáveis e comparadoras em Java. Uma interface comparável é usada para classificar os objetos de acordo com a ordem natural e por vez pode classificar os objetos apenas em um campo.
A interface comparável tem um método ‘compareTo ()’ que precisa ser substituído na classe que implementa a interface Comparator e cujos objetos devem ser classificados.
A interface Comparator é usada para classificar objetos personalizados que devem ser classificados com base em qualquer outra ordem. A interface do comparador também nos permite classificar objetos de duas classes diferentes com base em vários campos.
=> Leia a série de treinamento Easy Java.
Leitura recomendada
- Interface Java e tutorial de classe abstrata com exemplos
- Definir interface em Java: Tutorial de conjunto de Java com exemplos
- Implantação Java: Criação e execução de arquivo JAR Java
- Java Basics: Java Syntax, Java Class e Core Java Concepts
- Java Virtual Machine: como a JVM ajuda na execução de aplicativos Java
- Interface ListIterator em Java com exemplos
- Matriz de objetos em Java: como criar, inicializar e usar
- Tutorial JAVA para iniciantes: mais de 100 tutoriais práticos em vídeo Java