Tudo bonito, otimo maravilhoso; o codigo se escreve sozinho. Mas se a ordem necessaria for ao contrario faz como? Tem que implementar a classe, llamar o comparador etc.?
Tudo bonito, otimo maravilhoso; o codigo se escreve sozinho. Mas se a ordem necessaria for ao contrario faz como? Tem que implementar a classe, llamar o comparador etc.?
Olá Yaco, tudo bem com você?
Se quiser ordenar a coleção palavras
partindo da palavra mais longa para a mais curta, podemos usar o método reversed()
. Então, vamos assumir que para todos os exemplos que eu passar adiante nós já temos a lista de palavras previamente declarada e ordenada:
Declaração e ordenação da lista de palavras
List<String> palavras = new ArrayList<>();
palavras.add("alura online");
palavras.add("casa do código");
palavras.add("caelum");
palavras.sort(Comparator.comparing(s -> s.length()));
palavras.forEach(System.out::println);
A primeira forma é a que eu considero menos elegante, já que temos que fazer um casting para ela dar certo. Isso porque ao invertermos a ordem da lista através do método reversed()
, o Java deixa de fazer a inferência de tipo dos elementos da lista para objetos do tipo String e exige que nós deixemos explicito que queremos fazer a conversão de tipo.
Usando o método reversed() e fazendo casting de cada elemento
palavras.sort(Comparator.comparing(s -> ((String) s).length()).reversed());
palavras.forEach(System.out::println);
A segunda forma é a mais clara e sucinta para esse caso! Ela utiliza o method reference que foi abordado na última aula. Então, além de deixar o código mais enxuto e legível, agora não precisamos mais fazer o casting para o tipo String, já que agora estamos explicitando na própria chamada do método (String::length()
) que os elementos dentro da lista palavras
são elegíveis como argumentos de um método da classe String.
Usando o método reversed() com method reference
palavras.sort(Comparator.comparing(String::length).reversed());
palavras.forEach(System.out::println);
Como eu mencionei, a forma anterior seria a mais apropriada para essa situação, porém a forma que vou mostrar agora também é válida e se algum dia você der de cara com ela, não será uma surpresa. A maior diferença aqui é que usaremos a classe Collections para fazer a ordenação. Para isso, o método sort()
dela recebe dois argumentos: a coleção que queremos ordenar (palavras
, no nosso caso) e o critério de ordenação (Comparator).
Usando o método sort() da classe Collections
Collections.sort(palavras, Comparator.comparing(String::length).reversed());
palavras.forEach(System.out::println);
É possível fazer esse mesmo tipo de ordenação de N outras maneiras, mas até esse ponto do curso, acredito que essas são formas mais práticas e comuns de ordenar uma coleção invertendo seus elementos.
Qualquer dúvida é só avisar! Bons estudos!!
Valeu Thiago, muito boa e muito profissional sua explicacao! É a primeira vez que recebo uma resposta tao objetiva, abrangente e eficiente aqui. Isso me faz pensar que a ineficiencia do forum nao seja responsabilidade dos instrutores, senao da politica da empresa. E a empresa, que supostamente ensina boas praticas, deveria saber que essa politica nao é uma boa pratica. Muito obrigado pela ajuda.