Ajuda para fazer refactoring

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 :smiley:

[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.