How to order a table using Collections?

Asked

Viewed 374 times

1

I’m developing an application similar to the Olympic medal board. I’ve done the classes and the table with the countries and their medals. Now I’m hooked on the part I need to organize the table by the largest amount of gold, tie in gold, check the largest number of silver and so also with bronze.

Below are my classes:

Country Class:

public class Pais {

private String nome;
private String iso;
private ArrayList<Atleta> atletas;

private int ouro;
private int prata;
private int bronze;

public Pais(String n, String i) {
    nome = n;
    iso = i;
    atletas = new ArrayList<>();
}

public void addAtleta(Atleta a) {
    atletas.add(a);
}

public String getNome() {
    return nome;
}

public String getIso() {
    return iso;
}

public int getOuro() {
    return ouro;
}

public int getPrata() {
    return prata;
}

public int getBronze() {
    return bronze;
}

public void atualizar() {
    ouro = 0;
    prata = 0;
    bronze = 0;
    for (Atleta a : atletas) {
        switch (a.getMedalha()) {
            case Medalha.OURO:
                ouro++;
                break;
            case Medalha.PRATA:
                prata++;
                break;
            case Medalha.BRONZE:
                bronze++;
                break;
        }
    }
}

Olympiad Class:

public class Olimpiada {

private ArrayList<Modalidade> modalidades;
private ArrayList<Pais> paises;
private String sede;
private int ano;

public Olimpiada(String s, int a) {
    sede = s;
    ano = a;
    modalidades = new ArrayList<>();
    paises = new ArrayList<>();
}

public void addPais(Pais p) {
    paises.add(p);
}

public void addModalidade(Modalidade m) {
    modalidades.add(m);
}

public String getSede() {
    return sede;
}

public int getAno() {
    return ano;
}

public void listarPaises() {
    for (Pais p : paises) {
        System.out.println(p.getNome() + " " + p.getIso() + "\n");
    }
}

public void gerarRanking() {
    for (Pais p : paises) {
        p.atualizar();
        System.out.println(p.getIso() + "\t" + p.getOuro() + "\t" + p.getPrata() + "\t" + p.getBronze() + "\t" + (p.getOuro() + p.getPrata() + p.getBronze()));
    }
}

}

Class Modality:

public class Modalidade {

private String nome;
private boolean coletiva;

public Modalidade(String n, boolean c) {
    nome = n;
    coletiva = c;
}

}

Class Medal:

public class Medalha {

public static final int OURO = 0;
public static final int PRATA = 1;
public static final int BRONZE = 2;

}

Athlete class:

public class Atleta {

private String nome;
private int medalha;
private char sexo;
private Date data;
private Modalidade modalidade;

public Atleta(String n, int m, char s, Date d, Modalidade mo) {
    nome = n;
    medalha = m;
    sexo = s;
    data = d;
    modalidade = mo;
}

public int getMedalha() {
    return medalha;
}

}

Main Class:

  public class Main {

public static void main(String[] args) {
    Olimpiada rio2016 = new Olimpiada("Rio", 2016);

    Modalidade atletismo = new Modalidade("Atletismo", false);
    Modalidade judo = new Modalidade("Judo", false);
    Modalidade box = new Modalidade("Box", false);
    Modalidade tenis = new Modalidade("Tenis", false);
    Modalidade futebol = new Modalidade("Futebol", true);
    Modalidade volei = new Modalidade("Volei", true);
    Modalidade handebol = new Modalidade("Handebol", true);
    Modalidade basquete = new Modalidade("Basquete", true);
    Modalidade natacao = new Modalidade("Natação", true);

    Pais bra = new Pais("Brasil", "BRA");
    bra.addAtleta(new Atleta("Rafaela Silva", Medalha.OURO, 'F', null, judo));
    bra.addAtleta(new Atleta("Thiago Silva", Medalha.OURO, 'M', null, atletismo));
    bra.addAtleta(new Atleta("Alana Bezerra", Medalha.BRONZE, 'F', null, tenis));
    bra.addAtleta(new Atleta("Helena Maria", Medalha.PRATA, 'F', null, handebol));
    bra.addAtleta(new Atleta("Anderson Cardoso", Medalha.PRATA, 'M', null, basquete));
    bra.addAtleta(new Atleta("Rafael M", Medalha.PRATA, 'M', null, natacao));
    bra.addAtleta(new Atleta("Alex V", Medalha.BRONZE, 'M', null, atletismo));
    bra.addAtleta(new Atleta("Neymar Jr.", Medalha.OURO, 'M', null, futebol));

    Pais usa = new Pais("Estados Unidos", "USA");
    usa.addAtleta(new Atleta("Fernanda P", Medalha.OURO, 'F', null, judo));
    usa.addAtleta(new Atleta("Monica T", Medalha.OURO, 'F', null, basquete));
    usa.addAtleta(new Atleta("Ammy A", Medalha.PRATA, 'F', null, basquete));
    usa.addAtleta(new Atleta("Tommy S", Medalha.PRATA, 'M', null, futebol));
    usa.addAtleta(new Atleta("Mary J", Medalha.PRATA, 'F', null, natacao));
    usa.addAtleta(new Atleta("Mikael L", Medalha.BRONZE, 'M', null, natacao));
    usa.addAtleta(new Atleta("Jessy E", Medalha.OURO, 'F', null, handebol));
    usa.addAtleta(new Atleta("Jammy C", Medalha.OURO, 'M', null, tenis));

    Pais esp = new Pais("Espanha", "ESP");
    esp.addAtleta(new Atleta("Jesenia D", Medalha.BRONZE, 'F', null, basquete));
    esp.addAtleta(new Atleta("Isona E", Medalha.BRONZE, 'F', null, natacao));
    esp.addAtleta(new Atleta("Ginesa F", Medalha.BRONZE, 'F', null, handebol));
    esp.addAtleta(new Atleta("Prado E", Medalha.PRATA, 'M', null, handebol));
    esp.addAtleta(new Atleta("Pelayo J", Medalha.PRATA, 'M', null, tenis));
    esp.addAtleta(new Atleta("Ixeya U", Medalha.PRATA, 'F', null, futebol));
    esp.addAtleta(new Atleta("Maica T", Medalha.OURO, 'F', null, atletismo));
    esp.addAtleta(new Atleta("Orlando O", Medalha.OURO, 'M', null, futebol));

    rio2016.addPais(bra);
    rio2016.addPais(usa);
    rio2016.addPais(esp);
    rio2016.addModalidade(judo);
    rio2016.addModalidade(atletismo);
    rio2016.addModalidade(box);
    rio2016.addModalidade(futebol);
    rio2016.addModalidade(tenis);
    rio2016.addModalidade(handebol);
    rio2016.addModalidade(natacao);
    rio2016.addModalidade(natacao);

    //rio2016.listarPaises();
    rio2016.gerarRanking();
}

}
  • 1

    And what’s the doubt?

  • I don’t know exactly how to sort these lists. Like.. I wanted a way to go.. an example you could use as a reference to continue

1 answer

2


Here’s a small example of how you use Collection to sort. I hope from this you can solve your problem.

List<SEUOBJETO> lista = new ArrayList<SEUOBJETO>();
Comparator<SEUOBJETO> comparador = new Comparator<SEUOBJETO>() {
 // você pode comparar um objeto inteiro ou apenas um elemento do objeto.
public int compare(objeto o1.ouros, objeto o2.ouros) {
    return o2.getId() - o1.getId(); // Vai determinar o maior
   }
};

Collections.sort(list, comparador); // use o comparador para ordenar.
System.out.println(list);

// To do with multiple comparators

public class classeDeComparacao implements Comparator<CLASSE> {
   // Recebe os objetos da sua classe
  public int compare(CLASSE o1, CLASSE o2) {
    return ComparisonChain.start()
    .compare(r1.ouros(), r2.ouros())
    .compare(r1.pratas(), r2.pratas())
    .compare(r1.bronzes(), r2.bronzes())
    .result();
  }
}
  • What if gold is equal? How will the Commander define the tie-breaker with silver and bronze and, finally, totals?

  • yeah. he needs to make this comparison with all medals in the event of a tie, and if he persists he will leave them in the same position the countries draws

  • 1

    edited with another small example.

  • that Comparisonchain would be what in my code;}?

  • 1

    @Carlosdiego and a function of a Google library, its code is here https://github.com/google/guava/blob/master/guava/src/com/google/common/collect/ComparisonChain.java

  • 1

    @Carlosdiego if you want to take the jar of this lib I leave the link https://mvnrepository.com/artifact/com.google.guava/guava/19.0

Show 1 more comment

Browser other questions tagged

You are not signed in. Login or sign up in order to post.