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

Usando lista encadeada

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

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();
     }
1 curtida

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.

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

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();
	}
}
1 curtida

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

@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

Quando o prox elemento da lista for nulo?

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");
	
}
1 curtida

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();
	}
}



2 curtidas

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

1 curtida

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

1 curtida

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.


1 curtida