Tirar virgula final metodo println [RESOLVIDO]

11 respostas
ksmarini

Pesquisei bastante do fórum e não encontrei minha resposta
Estava fazendo um exercício da apostila da Caelum sobre a série de fibonacci com apenas duas variáveis.
Até aí tudo tranquilo. O problema é que ele imprime uma vírgula depois do último número da série.
como faço pra não imprimir essa vírgula no final da sequência???

Segue o que eu fiz:

public class Fibonacci{
	public static void main(String[] args){
		for(int x = 0, y = 1; x < 100; y = y + x, x = y - x){
			System.out.print(x + ", ");
		}
	}
}

11 Respostas

S

Amigo, estou tentando fazer a olho nu. rsrsrs. Vê se consegue assim.

public class Fibonacci{   
    public static void main(String[] args){
   
        for(int x = 0, y = 1; x < 100; y = y + x, x = y - x){   
            
System.out.print(x);
if (x<100){
System.out.print(",");
}
   
        }   
    }   
}

Creio que dê certo.

ksmarini

Vlw por responde, mas deu certo não. O último número da série é 89 e esse número é menor que 100, portanto ele coloca a vírgula depois do 89.

o resultado deveria ser esse:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89

mas está vindo assim:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,

lucas_guj

Faz assim KSMARINI:

public class Fibonacci
{  
	public static void main(String[] args)
	{  
		for(int x = 0, y = 1; x < 100; y = y + x, x = y - x)
		{  
			if( x > 0 )
			{
				System.out.print(", ");
			}
			System.out.print(x);  
		}  
	}  
}
regis_hideki

Isso evita a necessidade de uma condicional executando O(n) vezes:

// primeiro elemento da série
System.out.print(0);

// o x começa pelo segundo elemento da série (1)
for (int x = 1, y = 1; x < 100; y = y + x, x = y - x) {
	System.out.print(", " + x);
}

Quando separo por vírgulas, prefiro printar o primeiro elemento e depois seguir o padrão de “vírgula + próximo elemento” do que verificar qual o último elemento.

ksmarini

A solução do regis_hideki, também resolve o problema, mas eu teria que conhecer o primeiro elemento pra poder imprimi-lo, com a solução do lucas, o próprio laço resolve se há necessidade ou não da virgula. Gostei muito Lucas, muito obrigado. :smiley:

Ficou muito elegante e de fácil entendimento.

lucas_guj:
Faz assim KSMARINI:

public class Fibonacci
{  
	public static void main(String[] args)
	{  
		for(int x = 0, y = 1; x < 100; y = y + x, x = y - x)
		{  
			if( x > 0 )
			{
				System.out.print(", ");
			}
			System.out.print(x);  
		}  
	}  
}

lucas_guj

De Nada. Fico feliz em ter ajudado. Eu gosto de colocar o código dessa maneira pois foi assim que aprendi no Deitel. Do jeito que você colocou no primeiro post fica meio embaçado para mim. E não esquece de colocar resolvido no tópico FLW? Abraços

ksmarini

Vlw lucas, já tá editado como resolvido. quanto a parte de identação eu acho mais fácil do jeito do povo da O’REILLY, onde eu começei a entrar no mundo java. rsrs
o meu acabou ficando assim:

public class Fibonacci{
	public static void main(String[] args){
		for(int x = 0, y = 1; x < 100; y = y + x, x = y - x){
			if( x > 0){
				System.out.print(", ");
			}
			System.out.print(x);
		}
	}
}

Mas fico realmente agradecido com suas dicas. :smiley:

regis_hideki

ksmarini:

A solução do regis_hideki, também resolve o problema, mas eu teria que conhecer o primeiro elemento pra poder imprimi-lo, com a solução do lucas, o próprio laço resolve se há necessidade ou não da virgula. Gostei muito Lucas, muito obrigado. :smiley:

Ficou muito elegante e de fácil entendimento.

lucas_guj:
Faz assim KSMARINI:

public class Fibonacci
{  
	public static void main(String[] args)
	{  
		for(int x = 0, y = 1; x < 100; y = y + x, x = y - x)
		{  
			if( x > 0 )
			{
				System.out.print(", ");
			}
			System.out.print(x);  
		}  
	}  
}

Mas desse jeito também precisa saber o primeiro elemento.

Quando você inicializou o x como 0 no for, e printou o x na primeira iteração, já deixou implícito que o primeiro elemento era o 0. O segundo elemento você também já sabe, que é o valor inicializado no y. Portanto, pro seu código funcionar, você precisa dos dois primeiros elementos da série. O meu, do jeito que estava, precisava dois três primeiros: printei o primeiro, fiz o x receber o segundo e o y receber o terceiro na inicialização do for.

Mas a necessidade de saber o terceiro elemento pode ser resolvida da seguinte forma:

//inicializa exatamente como você inicializou no seu for
		int x = 0;
		int y = 1;
		
		//simula a primeira iteração do seu laço
		System.out.print(x);
		y = y + x;
		x = y - x;
		
		//x e y já foram inicializados. 
		//Daqui pra frente esse laço faz exatamente a mesma coisa que o seu faz da segunda iteração em diante,
		//mas não necessita do if a cada iteração.
		for (; x < 100; y = y + x, x = y - x) {
			System.out.print("," + x);
		}
	}
regis_hideki

ksmarini:

A solução do regis_hideki, também resolve o problema, mas eu teria que conhecer o primeiro elemento pra poder imprimi-lo, com a solução do lucas, o próprio laço resolve se há necessidade ou não da virgula. Gostei muito Lucas, muito obrigado. :smiley:

Ficou muito elegante e de fácil entendimento.

lucas_guj:
Faz assim KSMARINI:

public class Fibonacci
{  
	public static void main(String[] args)
	{  
		for(int x = 0, y = 1; x < 100; y = y + x, x = y - x)
		{  
			if( x > 0 )
			{
				System.out.print(", ");
			}
			System.out.print(x);  
		}  
	}  
}

Mas desse jeito também precisa saber o primeiro elemento.

Quando você inicializou o x como 0 no for, e printou o x na primeira iteração, já deixou implícito que o primeiro elemento era o 0. O segundo elemento você também já sabe, que é o valor inicializado no y. Portanto, pro seu código funcionar, você precisa dos dois primeiros elementos da série. O meu, do jeito que estava, precisava dois três primeiros: printei o primeiro, fiz o x receber o segundo e o y receber o terceiro na inicialização do for.

Mas a necessidade de saber o terceiro elemento pode ser resolvida da seguinte forma:

//inicializa exatamente como você inicializou no seu for
		int x = 0;
		int y = 1;
		
		//simula a primeira iteração do seu laço
		System.out.print(x);
		y = y + x;
		x = y - x;
		
		//x e y já foram inicializados. 
		//Daqui pra frente esse laço faz exatamente a mesma coisa que o seu faz da segunda iteração em diante,
		//mas não necessita do if a cada iteração.
		for (; x < 100; y = y + x, x = y - x) {
			System.out.print("," + x);
		}
	}
lucas_guj

Flw voce que sabe. (y) :smiley:

ksmarini
Mas desse jeito também precisa saber o primeiro elemento.

Quando você inicializou o x como 0 no for, e printou o x na primeira iteração, já deixou implícito que o primeiro elemento era o 0. O segundo elemento você também já sabe, que é o valor inicializado no y. Portanto, pro seu código funcionar, você precisa dos dois primeiros elementos da série. O meu, do jeito que estava, precisava dois três primeiros: printei o primeiro, fiz o x receber o segundo e o y receber o terceiro na inicialização do for.

Mas a necessidade de saber o terceiro elemento pode ser resolvida da seguinte forma:

//inicializa exatamente como você inicializou no seu for
		int x = 0;
		int y = 1;
		
		//simula a primeira iteração do seu laço
		System.out.print(x);
		y = y + x;
		x = y - x;
		
		//x e y já foram inicializados. 
		//Daqui pra frente esse laço faz exatamente a mesma coisa que o seu faz da segunda iteração em diante,
		//mas não necessita do if a cada iteração.
		for (; x < 100; y = y + x, x = y - x) {
			System.out.print("," + x);
		}
	}

É verdade. :)
Optei pela outra solução pq pra mim ficou mais fácil visualizar o código.
Mesmo assim, muito obrigado. é sempre bom ver outra forma de resolver o problema, pois nem sempre a mesmo solução pode ser empregada pra resolver problemas semelhantes. vlw

Criado 10 de fevereiro de 2012
Ultima resposta 10 de fev. de 2012
Respostas 11
Participantes 4