Como inverter uma sequencia de números passando só uma vez por eles

13 respostas Resolvido
M

Usando lista encadeada

13 Respostas

D

Poste no minimo o seu código e o que já fez?

M

Tô em dúvida de como receber do teclado, tipo no array no início é definido o tamanho, na lista isso não acontece.
Pelo meu código eu consigo add nó e imprimir a lista, mas não sei uma forma de receber n números usando o scanner.

public static void main(String[] args){
	ListaDinamica teste = new ListaDinamica();
	Scanner in = new Scanner(System.in);
	teste.add(1);
	teste.add(2);
	teste.add(3);
	teste.add(4);
	teste.add(5);
	teste.imprimirLista();
     }
D

A lógica e a montagem do Scanner seria assim:

import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone
{
	public static void main (String[] args) throws java.lang.Exception
	{
		ListaDinamica teste = new ListaDinamica();
		Scanner input = new Scanner(System.in);
		Integer i = 0;
		while (i != -1)
		{
		     i = input.nextInt();
		     teste.add(i);
		}
		teste.imprimirLista();
	}
}

Ou seja, o fim do while é quando digitar -1, logo sai da estrutura de repetição e imprime a lista que foi preenchida.

M

Tem alguma outra forma que não precise de algum termo para sair do while?

D

No caso especifico poderia ter um termino limitando alguma variavel para rodar esse while até um determinado valor. Exemplo com uma variavel de termino fixa:

import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone
{
	public static void main (String[] args) throws java.lang.Exception
	{
		ListaDinamica teste = new ListaDinamica();
		Scanner input = new Scanner(System.in);
		Integer i, n = 0;
		while (i <= 4) // esse for vai ler 5 números
		{
		     n = input.nextInt();
		     teste.add(i);
	             i = i + 1;
		}
		teste.imprimirLista();
	}
}
M

O pior que a lista não tem tamanho fixo. Então não dá pra usar.

D

@marcos678 tudo é lógica, você está confundido solução com o que você deseja fazer: vamos lá Como você quer parar o preenchimento dessa lista dinâmica? E logo após mostrar?

Observação: Não tem como você ficar preechendo infinitamente uma lista

M

Quando o prox elemento da lista for nulo?

D

Quando o próximo elemento a ser inserido na lista for diferente de um número, correto ?

Então, eu já postei uma solução que o while pare quando for -1, eu também já coloque uma com um valor fixo de elementos que é 4, e agora para finalizar meu apoio, você vai antes de entrar no while decidir a quantidade de elementos a ser inseridos:

public static void main(String[] args) {
	Scanner input = new Scanner(System.in);
	ArrayList<Integer> array = new ArrayList<>();        
	Integer num = 0,i = 0, count = 0;
	
	System.out.print("Digite a quantidade de elementos: ");
	count = input.nextInt();
	
	while (i < count)
	{
		num = input.nextInt();
		array.add(num);
		i++;
	}
	
	System.out.println("");
	System.out.println("Imprimindo resultados");
	System.out.println("");
	
	for(Integer n : array)
	{
		System.out.println(n);
	}
	
	System.out.println("");
	System.out.println("Fim");
	
}
E
Solucao aceita

Amigo, fiz uma solução aqui

Classe Teste

public class Teste {

	public static void main(String[] args) {
		Lista lista = new Lista();

		Objeto objeto;
		Scanner input = new Scanner(System.in);

		do {
			objeto = new Objeto();
			System.out.print("Der um valor : ");
			String entrada = String.valueOf(input.nextLine());

			if (!entrada.equals("")) {
				objeto.setValor(Integer.valueOf(entrada));
				lista.adiciona(objeto);
			}
		} while (objeto.isAdicionado());

		input.close();
		lista.inverter();

		System.out.println(lista);	
	}

Classe Lista

public class Lista {
	private Objeto[] objetos = new Objeto[10];
	private int posicao = 0;

	public void adiciona(Objeto objeto) {
		if (posicao >= objetos.length) {
			this.aumentarArray();
		}
		objetos[posicao] = objeto;
		posicao++;
	}

	private void aumentarArray() {
		Objeto[] objetos2 = objetos;

		objetos = new Objeto[objetos2.length * 2];

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

	public void inverter() {
	
		Objeto[] objetos2 = new Objeto[posicao];
		int x = posicao-1, i = 0;
		while (i < posicao) {
			objetos2[i] = objetos[x];
			x--;
			i++;
		}
		
		for (i = 0; i < posicao; i++) {
			objetos[i] = objetos2[i];
		}
	}

	public Objeto[] getLista() {
		return objetos;
	}

	@Override
	public String toString() {
		String valor = "[";

		for (int i = 0; i < posicao; i++) {

			if (i == posicao - 1) {
				valor = valor + ", " + String.valueOf(objetos[i].getValor()) + "]";
			} else {
				if(valor.equals("[")){
					valor = valor + String.valueOf(objetos[i].getValor());
				}else{
					valor = valor + ",  " + String.valueOf(objetos[i].getValor());					
				}
			}
		}

		return valor;
	}
}

Classe Objeto

public class Objeto {

	private boolean isAdicionado = false;
	private Integer valor;

	public boolean isAdicionado() {
		return isAdicionado ;
	}

	public void setValor(Integer valor) {
		this.valor = valor;
		isAdicionado = true;// Caso adicione, o objeto indica que tem algum valor com
							// essa variavel booleana
	}

	
	public Integer getValor() {
		return valor;
	}
	
	@Override
	public String toString() {
		return valor.toString();
	}
}
E

Que isso cara, muito obrigado mesmo, bem no meu exemplo não fiz a lista encadeada, mas aprendi com esse link é só você ler com bastante atenção e praticar com os exemplos.

Abraço

M

Tentei modificar seu código para receber em uma linha, tipo: 1 2 3 4. Trocando String entrada = String.valueOf(in.nextLine()); por String entrada = String.valueOf(in.next()); Só que depois do último elemento, ele ainda fica recebendo, mas como não tem nada ele não para. Como contornar isso?

Abraço

E

Bem isso foi um problema na minha implementação

o nextLine pega tudo que você digitar ate o enter

o next() pega tudo que você digitar ate pressionar espaço ou enter além de possuir outros delimitadores

O mais completo para mim é o nextLine
Veja esse link(em inglês) tradução livre

Peguei uma ilustração da diferença entre os dois


next () pode ler a entrada apenas até o espaço. Ele não consegue ler duas palavras separadas por espaço. Além disso, ao lado () coloca o cursor na mesma linha após a leitura da entrada.

nextLine () lê espaço de entrada, incluindo entre as palavras (ou seja, ele lê até o fim da linha \ n). Uma vez que a entrada é lido, nextLine () posiciona o cursor na linha seguinte.


Criado 3 de junho de 2016
Ultima resposta 5 de jun. de 2016
Respostas 13
Participantes 3