Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Ajuda com Comparable

Ola a todos. Estou com uma duvida de como implementar um método do tipo Comparable. Tenho essas duas classes:

Book

public class Book implements Comparable {

    private BookTag tag;
    private int year;
    private String title;
    private int copies;

    public Book(BookTag tag, int year, String title) {
        this.tag = tag;
        this.year = year;
        this.title = title.toUpperCase();
        this.copies = 1;
    }

BookTag

public class BookTag implements Comparable {

    private String left;
    private int mid;
    private String right;

    public BookTag(String left, int mid, String right) {
        check(left, mid, right);
        this.left = left.toUpperCase();
        this.mid = mid;
        this.right = right.toUpperCase();
    }

O exercício consiste em implementar uma serie de métodos que já foram desenhados.

Esse seria o primeiro metodo na classe Book:

@Override
    public int compareTo(Object arg) {

        /* Books are sorted by booktag.  Books with lowest booktags go first */


    }

Aqui não tenho muita ideia do que tenho que fazer porque com quais elementos vou comparar o argumento que é passado? Tentei algo assim: (return 0 é só para não deixar com erro)

@Override
    public int compareTo(Object arg) {

        /* Books are sorted by booktag. Books with lowest booktags go first */

            Book book;
            book = (Book)arg;

            return 0;

    }

O outro método também estou um pouco perdido que seria da classe BookTag:

@Override
    public int compareTo(Object arg) {

        /*
         * Booktags are sorted as follows: - first go booktags with lowest left
         * attribute. If left attributes cannot discriminate... - ... first go booktags
         * with the lowest mid attribute. If mid cannot discriminate... - ... first go
         * booktags with HIGHEST right attribute.
         */

        /* COMPLETE */


        return 0;
    }
3 respostas
solução!

Boa noite, meu xará! Tudo certo?

Dentro do método compareTo() vc vai comparar o argumento passado com a instância que invocou o compareTo(), ou seja, vai comparar com o this! Veja esse exemplo prático:

package br.com.alura.gerenciador.web.teste;

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

public class Pessoa implements Comparable<Pessoa> {
    private int idade;

    public Pessoa(int idade) {
        this.idade = idade;
    }

    public int getIdade() {
        return idade;
    }

    @Override
    public int compareTo(Pessoa p) {
        return this.idade - p.getIdade();
    }

    @Override
    public String toString() {
        return "Idade: " + this.idade;
    }

    public static void main(String[] args) {
        Pessoa p1 = new Pessoa(10);
        Pessoa p2 = new Pessoa(7);

        List<Pessoa> pessoas = new ArrayList<>();
        pessoas.add(p1);
        pessoas.add(p2);

        System.out.println(p1.compareTo(p2));  // 3
        System.out.println(pessoas);  // [Idade: 10, Idade: 7]

        Collections.sort(pessoas);  // ordena de forma crescente.

        System.out.println(pessoas);  // [Idade: 7, Idade: 10]
    }
}

Pegou a ideia? Qualquer coisa é só falar!

Grande abraço e bons estudos, meu aluno!

Ola Xará! Antes de tudo obrigado pela ajuda.

Acho que peguei a ideia com o seu exemplo, e consegui fazer esse código aqui:

@Override
    public int compareTo(Object arg) {

        /* Books are sorted by booktag. Books with lowest booktags go first */

        Book other = (Book) arg;

        int resultado = this.tag.compareTo(other.tag);

        if (resultado < 0) { 
            System.out.println(this.tag);
            return -resultado;
        }
        if (resultado > 0) { 
            System.out.println(other.tag);
            return -resultado;
        }
        System.out.println("They are equals");
        return -resultado;
    }

Muito bem, meu aluno! Sempre que precisar de qualquer ajuda é só mandar aqui no fórum! E agora, é só seguir em frente nos estudos!

Grande abraço e sucesso pra vc!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software