Olá a todos…
Gostaria da ajuda de vocês para fazer uma refatoração em código. Só para constar isso não é nenhum trabalho de faculdade ou alguma coisa parecido, só quero ajuda para a refatoração que fiz e não estou gostando.
Situação:
Tenho um texto e tenho que mostrar a maior palavra do texto. Caso existam palavras(as maiores) que tenham tamanhos iguais, deve ser mostrado essas palavras.
Código que fiz:
[code]String text = "esse texto tem varias strins que são analisadas ";
String[] list = text.split(" ");
ArrayList<String> listFinal = new ArrayList<String>();
int maior = 0;
for(int i =0;i<list.length;i++){
if(list[i].length()>= maior){
maior = list[i].length();
}
}
for(int i=0;i<list.length;i++){
if(list[i].length()==maior){
listFinal.add(list[i]);
}
}
for(String word:listFinal){
System.out.println(word);
}[/code]
Ps. não gostei desse código que fiz!!!
Acho que é isso…
Espero que alguem possa ajudar!
Abraaaaço
Poderia reduzir a quantidade de laços:
String texto = "Este texto tem varias palavras que são analisadas ou comparadas";
String[] palavras = texto.trim().split(" ");
if (palavras.length > 0) {
List<String> palavrasMaiores = new ArrayList<String>();
palavrasMaiores.add(palavras[0]);
int tamanhoDaMaiorPalavra = palavras[0].length();
for (int i = 1; i < palavras.length; i++) {
String palavraCorrente = palavras[i];
int diferencaDeTamanho = palavraCorrente.length() - tamanhoDaMaiorPalavra;
if (diferencaDeTamanho > 0) {
palavrasMaiores.clear();
tamanhoDaMaiorPalavra = palavraCorrente.length();
}
if (diferencaDeTamanho >= 0) {
palavrasMaiores.add(palavraCorrente);
}
}
for (String palavra : palavrasMaiores) {
System.out.println(palavra);
}
}
As variáveis temporárias palavraCorrente e tamanhoDaMaiorPalavra são desnecessárias, mas usei para deixar mais claro o algoritmo.
Que tal assim? Aumenta um pouco as linhas, mas ganha-se clareza no código (na minha opinião):
[code]public static void main(String[] args)
{
String texto = "esse texto tem varias strins que são analisadas “;
String[] palavras = texto.split(” ");
int maior = acharTamanhoMaiorPalavra(palavras);
for( String palavra : palavras )
{
if( palavra.length() == maior )
System.out.println(palavra);
}
}
private static int acharTamanhoMaiorPalavra(String[] palavras)
{
int maior = 0;
for( String palavra : palavras)
{
if( palavra.length() > maior )
maior = palavra.length();
}
return maior;
}[/code]
Também acho que ficou melhor assim, já que a necessidade é apenas imprimir na tela os strings maiores.
Se precise guardar a lista também não seria dificil
[code]List maioresPalavras = new ArrayList();
if( palavra.length() == maior )
maioresPalavras.add(palavra); [/code]
A diferença é que você já inclui a primeira palavra na lista, e se acha uma maior remove e começa a incluir de novo. A lógica fica mais fácil se você primeiro acha o maior tamanho.
O seu algoritmo percorre a lista apenas uma vez. O meu duas vezes.
Exatamente, a lista é percorrida uma vez apenas. Mas eu ainda ficaria com este seu que é mais legível e usaria o que eu fiz só se surgisse necessidade de otimização.
Olá…
Queria agradecer as respostas de vocês…
Gostei de todas as ajudas oferecidas e gostei do código que o RafaelViana fez.
Ficou fácil de entender.
Mas falou também andreymb.
Até mais!
Agradeço a atenção.