Você está aqui: Java ::: Pacote java.util ::: Comparator

Como escrever uma classe que implementa a interface Comparator para controlar a ordenação dos elementos de uma coleção

Quantidade de visualizações: 1810 vezes
Nesta dica eu mostro como escrever uma classe que implementa a interface Comparator para controlar a ordenação dos elementos de uma coleção. No exemplo mostro também como usar constantes para definir a forma de ordenação. Vamos começar criando uma classe Livro. Veja o código:

package estudos;

public class Livro{
  // para simplificar o exemplo não usarei encapsulamento de dados
  String titulo;
  int paginas;
  
  // construtor não padrão
  public Livro(String titulo, int paginas){
    this.titulo = titulo;
    this.paginas = paginas;
  }
}

Agora vamos criar a classe que implementará a interface Comparator:

package estudos;

import java.util.Comparator;

public class OrdenacaoLivros implements Comparator<Livro>{
  // constantes que permitem definir o tipo de ordenação a ser realizada
  public final static int TITULO = 1; 
  public final static int PAGINAS = 2;
  private int tipoOrdenacao; // guarda o tipo da ordenação desejada
  
  public OrdenacaoLivros(int tipoOrdenacao){
    this.tipoOrdenacao = tipoOrdenacao;
  }
  
  // sobrescreve o método compare() e faz a ordenação de acordo com o critério desejado 
  @Override
  public int compare(Livro a, Livro b){
    // ordenação por páginas?    
    if(this.tipoOrdenacao == OrdenacaoLivros.PAGINAS){
      return a.paginas - b.paginas;
    }
    // ordenação por título?
    else if(this.tipoOrdenacao == OrdenacaoLivros.TITULO){
      return a.titulo.compareTo(b.titulo);  
    }
    else{
      // ordenação desconhecida
      System.out.println("Ordenação desconhecida");
      return 0;
    }
  }  
}

Note que o método compare() testa o tipo de ordenação para classificar os livros de acordo com o número de páginas ou ordem alfabética do título. Finalmente, veja o código para a classe principal da aplicação:

package estudos;

import java.util.ArrayList;
import java.util.Collections;

public class Estudos{
  public static void main(String[] args) {
    // vamos criar uma ArrayList de objetos da classe Livro
    ArrayList<Livro> livros = new ArrayList();
    livros.add(new Livro("Programando em Java", 259));
    livros.add(new Livro("A Bíblia do Delphi", 1043));
    livros.add(new Livro("Aprenda PHP e MySQL", 127));
    livros.add(new Livro("Tutorial Básico de JSF", 41));
    
    // vamos ordenar os elementos do ArrayList usando o método sort() da classe Collectons
    // e fornecendo um objeto OrdenacaoLivros com o critério de ordenação por páginas
    Collections.sort(livros, new OrdenacaoLivros(OrdenacaoLivros.PAGINAS));
    
    // vamos percorrer e exibir os valores dos elementos ordenados por quantidade de página
    for(Livro livro : livros){
      System.out.println("Título: " + livro.titulo + "; Páginas: " + livro.paginas);
    }
    
    // vamos ordenar os elementos do ArrayList usando o método sort() da classe Collectons
    // e fornecendo um objeto OrdenacaoLivros com o critério de ordenação por título
    Collections.sort(livros, new OrdenacaoLivros(OrdenacaoLivros.TITULO));
    
    // vamos percorrer e exibir os valores dos elementos ordenados por título
    System.out.println();
    for(Livro livro : livros){
      System.out.println("Título: " + livro.titulo + "; Páginas: " + livro.paginas);
    }
  }
}

Ao executarmos este exemplo nós teremos o seguinte resultado:

Título: Tutorial Básico de JSF; Páginas: 41
Título: Aprenda PHP e MySQL; Páginas: 127
Título: Programando em Java; Páginas: 259
Título: A Bíblia do Delphi; Páginas: 1043

Título: A Bíblia do Delphi; Páginas: 1043
Título: Aprenda PHP e MySQL; Páginas: 127
Título: Programando em Java; Páginas: 259
Título: Tutorial Básico de JSF; Páginas: 41



Java ::: Lista de Exercícios Resolvidos (Algorítmos Resolvidos) ::: Métodos, Procedimentos e Funções

Métodos - Exercícios Resolvidos de Java - Ex. 2 - Um método estático chamado inverter() que recebe um número inteiro e retorna este mesmo número invertido

Quantidade de visualizações: 4831 vezes
Pergunta/Tarefa:

Escreva um método estático chamado inverter() que recebe um número inteiro e retorna este mesmo número invertido. Este método deverá ter a seguinte assinatura:

public static int inverter(int numero){
  // sua implementação aqui
}
Este método deverá, obrigatoriamente, estar na classe principal (aquela que contém o método main()). Após a implementação do método inverter(), vá até o método main() e peça ao usuário para informar um número inteiro qualquer. Em seguida faça uma chamada ao método inverter() passando o valor informado como argumento, obtenha o retorno e exiba-o.

ATENÇÃO: Para a resolução deste exercício é permitido usar apenas os operadores aritméticos.

Sua saída deverá ser parecida com:



Resposta/Solução:

Veja a resolução comentada deste exercício usando Java console:

package arquivodecodigos;

import java.util.Scanner;
 
public class Estudos{
  public static void main(String[] args) {
    // vamos fazer a leitura usando a classe Scanner
    Scanner entrada = new Scanner(System.in);
     
    // vamos pedir ao usuário que informe um número inteiro
    System.out.print("Informe um número inteiro: ");
    int numero = Integer.parseInt(entrada.nextLine());
     
    // fazer efetuar uma chamada ao método inverter() e obter o valor invertido
    int invertido = inverter(numero);
     
    // e exibir o resultado
    System.out.println("O valor invertido é: " + invertido);
  }
   
  // método estático que recebe um número inteiro e o devolve invertido
  public static int inverter(int numero){
    int resultado = 0; // guarda o resultado da inversão
     
    // enquanto número for diferente de 0
    while(numero != 0){
      // obtém resto da divisão de número por 10
      int resto = numero % 10;
 
      // resultado recebe ele mesmo multiplicado por 10 mais o resto
      resultado = resultado * 10 + resto;
 
      // finalmente número recebe ele mesmo dividido por 10
      numero = numero / 10;
    }
 
    return resultado; // retorna o resultado
  }
}



Java ::: Estruturas de Dados ::: Lista Ligada Simples / Lista Encadeada Simples / Singly Linked List

Estruturas de Dados em Java - Como inserir nós no início de uma lista singularmente ligada em Java

Quantidade de visualizações: 8698 vezes
Esta dica mostra como inserir nós no início de uma lista singularmente ligada. A classe usada para representar cada nó é a seguinte (No.java):

// classe No
public class No{
  public int valor;
  public No proximo;
}
// fim da classe No

Note que cada nó contém apenas um valor inteiro e um ponteiro para o próximo nó. Ao analisar o código você perceberá que tanto a inserção no início quanto a exibição dos nós são feitas usando métodos. Isso permitirá o reaproveitamento deste código em suas próprias implementações. Vamos ao código para a lista singularmente ligada (Lista.java):

public class Lista{
  No inicio; // início da lista  

  // método que permite exibir os valores de
  // todos os nós da lista
  public void exibir(){
    if(inicio != null){
      do{
        System.out.println(inicio.valor);
        inicio = inicio.proximo;
      }while(inicio != null);
    }
    else
      System.out.println("A lista esta vazia\n\n");
  }
 
  // método que permite inserir nós no
  // início da lista.
  // veja que o método recebe o valor a ser
  // armazenado em cada nó
  public void inserirInicio(int v){
    No novo;

    // verifica se a lista está vazia
    if(inicio == null){
      // reserva memória para o novo nó
      inicio = new No();
      inicio.valor = v;
      // é o primeiro nó...não deve apontar para
      // lugar nenhum
      inicio.proximo = null;
    }
    else{ // não está vazia....vamos inserir o nó no início
      // vamos criar um novo nó agora
      novo = new No();
      // atribui o valor do nó
      novo.valor = v;
      // define o inicio da lista como campo proximo
      // do novo nó
      novo.proximo = inicio;
      // o novo nó é o início da lista agora
      inicio = novo;
    }
  }
}

Compile as classes No.java e Lista.java e vamos escrever um aplicativo de teste (TesteLista.java):

public class TesteLista{
  public static void main(String args[]){
    // vamos criar uma nova lista
    Lista lista = new Lista();

    // vamos inserir quatro valores no
    // início da lista
    lista.inserirInicio(45);
    lista.inserirInicio(3);
    lista.inserirInicio(98);
    lista.inserirInicio(17);

    // exibe os valores na lista
    lista.exibir();

    System.exit(0);   
  }  
}



Java ::: Lista de Exercícios Resolvidos (Algorítmos Resolvidos) ::: Java Básico

Java Básico - Exercícios Resolvidos de Java - Ex. 16 - Lendo os lados de um triângulo e informando se o mesmo é isósceles, escaleno ou equilátero

Quantidade de visualizações: 7002 vezes
Pergunta/Tarefa:

Um triângulo é uma forma geométrica (polígono) composta de três lados, sendo que cada lado é menor que a soma dos outros dois lados. Assim, para que um triângulo seja válido, é preciso que seus lados A, B e C obedeçam à seguinte regra: A < (B + C), B < (A + C) e C < (A + B).

Escreva um programa Java que leia os três lados de um triângulo e verifique se tais valores realmente formam um triângulo. Se o teste for satisfatório, informe se o triângulo é isósceles (dois lados iguais e um diferente), escaleno (todos os lados diferentes) ou equilátero (todos os lados iguais).

Sua saída deverá ser parecida com:



Resposta/Solução:

Veja a resolução comentada deste exercício usando Java console:

package exercicios;

import java.util.Scanner;

public class Exercicios {
  public static void main(String[] args) {
    // vamos fazer a leitura usando a classe Scanner
    Scanner entrada = new Scanner(System.in);
      
    // vamos ler o primeiro lado do triângulo
    System.out.print("Informe o primeiro lado do triângulo: ");
    int ladoA = Integer.parseInt(entrada.nextLine());
    
    // vamos ler o segundo lado do triângulo
    System.out.print("Informe o segundo lado do triângulo: ");
    int ladoB = Integer.parseInt(entrada.nextLine());
    
    // vamos ler o terceiro lado do triângulo
    System.out.print("Informe o terceiro lado do triângulo: ");
    int ladoC = Integer.parseInt(entrada.nextLine());
    
    // os lados informados formam um triângulo?
    if((ladoA < (ladoB + ladoC)) && (ladoB < (ladoA + ladoC)) 
      && (ladoC < (ladoA + ladoB))){
      // é um triângulo equilátero (todos os lados iguais)?
      if((ladoA == ladoB) && (ladoB == ladoC)){
        System.out.println("O triângulo é equilátero");  
      }
      else{
        // é isósceles (dois lados iguais e um diferente)?
        if((ladoA == ladoB) || (ladoA == ladoC) || (ladoC == ladoB)){
          System.out.println("O triângulo é isósceles");  
        }
        else{
          // é escaleno
          System.out.println("O triângulo é escaleno");
        }
      }
    }
    else{
      System.out.println("Os lados informados não formam um triângulo.");
    }
  }
}



Java ::: Pacote java.awt.event ::: KeyEvent

Java Swing - Como detectar as teclas Insert ou Delete usando o método getKeyCode() da classe KeyEvent do Java

Quantidade de visualizações: 2235 vezes
Em algumas situações nós precisamos detectar o pressionamento das teclas Insert ou Delete. Para isso podemos usar o método getKeyCode() da classe KeyEvent e testar se o código equivale a uma das constantes KeyEvent.VK_INSERT (Ins) ou KeyEvent.VK_DELETE (Del).

Veja um trecho de código no qual testamos se alguma destas duas teclas foi pressionada:

package estudos;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class Janela extends JFrame implements KeyListener{
  public Janela(){
    super("Eventos do Teclado");
    Container c = getContentPane();
    FlowLayout layout = new FlowLayout(FlowLayout.LEFT);
    c.setLayout(layout);
    
    // vamos adicionar o objeto listener 
    addKeyListener(this);

    setSize(350, 250);
    setVisible(true);
  }
    
  @Override
  public void keyPressed(KeyEvent e){
    // a tecla Insert foi pressionada?
    if(e.getKeyCode() == KeyEvent.VK_INSERT){
      JOptionPane.showMessageDialog(null, "A tecla Insert foi pressionada");
    }
    // a tecla Enter Delete pressionada?
    else if(e.getKeyCode() == KeyEvent.VK_DELETE){
      JOptionPane.showMessageDialog(null, "A tecla Delete foi pressionada");
    }
    else{
      JOptionPane.showMessageDialog(null, "Outra tecla foi pressionada");  
    }
  }
    
  @Override
  public void keyReleased(KeyEvent e){
    // sem implementação
  }

  @Override
  public void keyTyped(KeyEvent e){
    // sem implementação
  }   
  
  public static void main(String args[]){
    Janela j = new Janela();
    j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
}

É importante observar que as teclas Insert e Delete podem ser detectadas somente nos eventos keyPressed e keyReleased.


Java ::: Lista de Exercícios Resolvidos (Algorítmos Resolvidos) ::: Laços

Laços - Exercícios Resolvidos de Java - Ex. 12 - Usando o laço for para converter um número binário em sua representação decimal

Quantidade de visualizações: 4875 vezes
Pergunta/Tarefa:

Escreva uma aplicação Java que usa o laço for para converter um número binário (como uma String) em sua representação decimal (como um int). Peça ao usuário para informar um número binário e mostre o mesmo em decimal (como um int). Sua solução deve obrigatoriamente usar o laço for.

Sua saída deverá ser parecida com:



Resposta/Solução:

Veja a resolução comentada deste exercício usando Java console:

package arquivodecodigos;

import java.util.Scanner;
 
public class Estudos{
  public static void main(String[] args) {
    // vamos fazer a leitura usando a classe Scanner
    Scanner entrada = new Scanner(System.in);
       
    // vamos ler o número binário (como uma String)
    System.out.print("Informe um número binário: ");
    String bin = entrada.nextLine();
    int decimal = 0; // guarda a representação decimal
     
    // vamos percorrer todos os dígitos do número binário começando do início
    for(int i = 0, exp = bin.length() - 1; i < bin.length(); i++, exp--){
      // converte o caractere atual para inteiro
      int temp = Character.digit(bin.charAt(i), 10);  
      decimal = decimal + (temp * (int)Math.pow(2, exp));
    }
     
    System.out.println("A representação decimal do valor binário " 
      + bin + " é " + decimal);
  }
}



Veja mais Dicas e truques de Java

Dicas e truques de outras linguagens

Quem Somos

Osmar J. Silva
WhatsApp +55 (062) 98553-6711

Goiânia-GO
Full Stack Developer, Professional Java Developer, PHP, C/C++, Python Programmer, wxWidgets Professional C++ Programmer, Freelance Programmer. Formado em Ciência da Computação pela UNIP (Universidade Paulista Campus Goiânia) e cursando Engenharia Elétrica pela PUC-Goiás. Possuo conhecimentos avançados de Java, Python, JavaScript, C, C++, PHP, C#, VB.NET, Delphi, Android, Perl, e várias tecnologias que envolvem o desenvolvimento web, desktop, front-end e back-end. Atuo há mais de 15 anos como programador freelancer, atendendo clientes no Brasil, Portugal, Argentina e vários outros paises.
Entre em contato comigo para, juntos, vermos em que posso contribuir para resolver ou agilizar o desenvolvimento de seus códigos.
José de Angelis
WhatsApp +55 (062) 98243-1195

Goiânia-GO
Formado em Sistemas de Informação pela Faculdade Delta, Pós graduado em Engenharia de Software (PUC MINAS), Pós graduado Marketing Digital (IGTI) com ênfase em Growth Hacking. Mais de 15 anos de experiência em programação Web. Marketing Digital focado em desempenho, desenvolvimento de estratégia competitiva, analise de concorrência, SEO, webvitals, e Adwords, Métricas de retorno. Especialista Google Certificado desde 2011 Possui domínio nas linguagens PHP, C#, JavaScript, MySQL e frameworks Laravel, jQuery, flutter. Atualmente aluno de mestrado em Ciência da Computação (UFG)
Não basta ter um site. É necessário ter um site que é localizado e converte usuários em clientes. Se sua página não faz isso, Fale comigo e vamos fazer uma analise e conseguir resultados mais satisfatórios..

Linguagens Mais Populares

1º lugar: Java
2º lugar: C#
3º lugar: PHP
4º lugar: Delphi
5º lugar: Python
6º lugar: JavaScript
7º lugar: C
8º lugar: C++
9º lugar: VB.NET
10º lugar: JSP (Java Server Pages)



© 2021 Arquivo de Códigos - Todos os direitos reservados | Versión en Español | Versão em Português