Como ordenar um array por dois campo?

Ola pessoal, me ajudem em uma duvida por favor!
Tenho que fazer um programa para a faculdade onde tenho que ordenar um array de Serie (uma classe criada) pelo campo de “paisOrigem” e as series que empatassem neste campo deveriam ser desempatadas pelo campo “nome”. Acontece que eu consegui fazer a primeira ordenação, mas não consigo pensar em uma logica para fazer o desempate, pois se eu passar mais uma ordenação, agora pelo campo “nome”, eu desorganizaria o primeiro processo de ordenação pelo campo “paisOrigem”, né?
Alguém pode me dar uma luz sobre o que devo fazer?
meu código esta assim até agora:

public static boolean isFim(String s) {
    return (s.length() == 3 && s.charAt(0) == 'F' && s.charAt(1) == 'I' && s.charAt(2) == 'M');
}

public static void main(String[] args) {

    /* Inicio - Leitura da entrada padrao */

    String[] entrada = new String[1000];
    int line = 0;

    do {
        entrada[line] = MyIO.readLine();
    } while (isFim(entrada[line++]) == false);
    line--;

    /* Fim - Leitura da entrada padrao */

    Serie[] s = new Serie[1000];// array de Serie declarado
    int count = 0;

    for (int i = 0; i < line; i++) {
        s[count] = new Serie();
        s[count].readClass(entrada[i]);
        count++;
    } // Todos os dados das series guardados dentro do array s

    selecao(s, count);// ordenação das series por pais

    for (int i = 0; i < count; i++) {
        s[i].printClass();
    }
}

public static Serie[] selecao(Serie[] array, int contador) {

    for (int i = 0; i < (contador - 1); i++) {
        int menor = i;
        for (int j = (i + 1); j < contador; j++) {
            if (array[menor].getCountry().compareTo(array[j].getCountry()) > 0) {
                menor = j;
            }
        }
        swap(array, menor, i);
    }

    return array;
}

// metodo para troca de poição das series chamado pelo metodo seleçãos
public static Serie[] swap(Serie[] array, int menor, int i) {
    Serie temp = array[menor].clone();
    array[menor] = array[i].clone();
    array[i] = temp.clone();

    return array;
}

public static Serie[] insercao(Serie[] array, int contador) {

    for (int i = 1; i < contador; i++) {
        Serie tmp = array[i];
        int j = i - 1;
        while ((j >= 0) && (array[j].getName().compareTo(tmp.getName()) > 0)) {
            array[j + 1] = array[j];
            j--;
        }
        array[j + 1] = tmp;
    }

    return array;
}

Esse método “insercao” seria aonde eu rodaria a segunda ordenação, mas, como disse ai em cima, não sei como fazer isso.

Sabe ali onde vc compara se é maior que 0? Então, vc tem que adicionar mais uma verificação para ver se é igual a 0. Se for igual a 0, vc compara pelo nome.

Eu fiz um exemplo. Como vc não colocou o código todo, algumas coisas eu tive que inventar. Eu também limpei o máximo que consegui do código pra ficar só o que importa. Ficou assim:

public class Main {
  private static class Serie {
    String country;
    String name;

    Serie(String name, String country) {
      this.name = name;
      this.country = country;
    }

    String getName() {
      return this.name;
    }

    String getCountry() {
      return this.country;
    }

    public void printClass() {
      System.out.printf("%s - %s\n", this.country, this.name);
    }

    @Override
    public Serie clone() {
      return new Serie(this.name, this.country);
    }
  }

  public static void main(String... args) {
    Serie[] s = { // @formatter:off
      new Serie("C", "US"),
      new Serie("D", "BR"),
      new Serie("A", "BR"),
      new Serie("E", "US"),
      new Serie("B", "BR"),
    }; // @formatter:on

    selecao(s, s.length);

    for (int i = 0; i < s.length; i++) {
      s[i].printClass();
    }
  }

  private static Serie[] selecao(Serie[] array, int contador) {
    for (int i = 0; i < (contador - 1); i++) {
      int menor = i;

      for (int j = (i + 1); j < contador; j++) {
        int comparison = array[menor].getCountry().compareTo(array[j].getCountry());

        if (comparison > 0) {
          menor = j;
        } else if (comparison == 0) {
          if (array[menor].getName().compareTo(array[j].getName()) > 0) {
            menor = j;
          }
        }
      }

      swap(array, menor, i);
    }

    return array;
  }

  private static Serie[] swap(Serie[] array, int menor, int i) {
    Serie temp = array[menor].clone();
    array[menor] = array[i].clone();
    array[i] = temp.clone();
    return array;
  }
}
1 curtida

Muito obrigado irmão, ajudou muito mesmo!!
Tava travado nessa, bgdao!

1 curtida

Porque está clonando?
Deveria usar as referências e não cópias delas.