Duvida rapida sobre tamanho de um vetor, como fazer um vetor sem saber o tamanho dele?

Bom galera, como o tópico já diz, queria saber como fazer um vetor sem saber o tamanho dele.

No caso, é o seguinte

O usuario digitará quantos numeros ele quiser, e o programa rodará em loop até o usuario digitar um numero negativo, após o numero negativo o programa para.

Como fazer para o tamanho do vetor ser exatamente a quantidade de numeros que o usuario digita?

Na verdade, o exercicio é mais complexo e tem outros metodos mais complexos, mas por ora só to com duvida nessa questão mesmo…

PS: Não posso, infelizmente, perguntar ao usuario “Quantos elementos tem seu vetor?” e declarar depois, senão seria facil, hehe!

Abraços!!

Impossível.

Só se usar uma Lista, ao invés de um vetor.
Não há como fazer a alocação dinamica para esse caso, supondo que o usuário digite 10 o vetor é criado com tamanho 10, digite 5 é criado com 5.
Somente você perguntando a ele quantos números ele deseja ou alocar o tamanho máximo de posições de um vetor, o que com certeza não recomendo :slight_smile:

Entendi…

É que é o seguinte, em uma das questoes desse mesmo exercicio, tem esse pedido:

“Quantos são pares e quantos sao impares?”

E se eu faço um for percorrendo o vetor (a principio eu tinha alocado um vetor de 1000 posições, consegui resolver as outras questoes assim) ele vai dizer que há centenas de numeros pares ao percorrer o vetor

for (i = 0; i<x.length; i++){ if (x[i]%2 == 0) par++; else impar++ ;

a nao ser é claro que o usuario digite os 1000 numeros, o que é semi-impossivel…

Tem como fazer o for percorrer somente até o ultimo numero digitado pelo usuario então?

To meio perdido… é que a prof foi bem enfática no que diz respeito a não perguntar ao usuario o tamanho do vetor :confused:

Muito obrigado, abraços ^^

entra com o tamanho do vetor

Scanner sc = new Scanner(System.in);
System.out.println("Entre com o tamanho do vetor"); --> aqui vai digitar o tamanho que voce quer que seu vetor seja
Integer tam = sc.nextInt();
int[] vetor = new int[tam];
for(int x=0; x < vetor.length; x++)
{
 System.out.println("Entre com os valores do vetor");
 vetor[x] = sc.nextInt();
}

Você está realmente se referindo a vetor(Array) ou você quer trabalhar com coleções?

Se estiver falando em array acho que não existe forma de você realocar o tamanho do vetor como em C/C++,
O que você pode fazer é:

Ter dois vetores a e b
digitou um número instancia a com tamanho 1 e insere o número

digitou mas um número
instancia b com tamanho de a +1,
copia a para b ,
insere o novo número no final de b,
copia b para a
isso vai ficar em loop até o usuário inserir um número negativo

Se você quiser apenas armazenar os número de forma sequencial em uma estrutura com tamanho dinâmico você pode usar um List

Então pronto, veja:

List<String> vetor = new ArrayList<String>(); vetor.add("10"); // assim por diante

É isso ou aplicar uma lógica, como o colega disse de criar dois vetores e etc ou outra qualquer que tu vá gerenciando tudo o que o usuário digita.
Caso contrário, não tem como fazer, pois não existe mágica em programação.

Abraços.

@Faicoxim

Obrigado pela resposta mas isso nesse exercicio especifico não me serve, amigão, não posso perguntar ao usuario a quantidade de elementos… infelizmente, mas obrigado!

@luciano

Cara, é Array mesmo! E pior que só tive umas 3 aulas de java, e a prof ja manda uma bomba dessa… mas é melhor pra aprender, to a tarde toda quebrando a cabeça nesse exercicio!

Gostei dessa ideia de copiar de um Array para o outro, nesse caso, basta eu fazer dois “for” que percorram os Arrays e usar a igualdade simples ?

Por exemplo, de uma olhada se esse codigo funcionaria de acordo com sua lógica, por favor

[code]
int x = new Int[500];

for (i = 0; i<x.length; i++) {
j = in.nextInt(); // << Aqui o usuario digitaria algo e verificaria se é negativo ou não
if (j < 0) break;
x[i] = z[i] } [/code]

Problema é, como que eu declararia o vetor Z (que seria o vetor “espelho”) ?

Muito obrigado!!!

Aqui tem um exemplo bastante completo do uso do List:

Muito obrigado a todos, estou dando uma olhada nesse tópico sobre o List!

Só espero que a professora aceite o uso do List, ela não fez referencia nenhuma a ele ainda.

Se alguem quiser, e puder, responder à minha duvida na msg anterior, sobre como eu faria a lógica caso eu quisesse fazer o que o colega disse de “passar os elementos para outro vetor” eu agradeceria imensamente, conhecimento é sempre bom!

Muito obrigado!

1 curtida

Declararia da mesma forma.
faça um laço de repetição do tamanho do espelho, ou do tamanho do array,
percorre pegando cada valor, e testa, se o valor for igual ou par, ou impar… se sim espelho recebe valor.

Mas larga a maooo, ArrayList na veia!

Você pode continuar criando seu array gigante, e contar quantos números o usuário digita. É uma alternativa equivalente a de perguntar o tamanho, mas ao invés de fazer a pergunta, vc mesmo conta quantos números foram digitados.

Você também pode aumentar o tamanho de um vetor copiando os dados de um vetor para outro maior.
Não é eficiente, mas resolve seu problema.

Por exemplo:

[code]Scanner in = new Scanner(System.in);
int lista[] = new int[0];
int tamanho = 0;
int numero = 0;

while (numero > 0) {
System.out.println(“Informe o número:”);
numero = Integer.parseInt(in.nextLine());
tamanho++;
//Cria um novo array, com um elemento a mais.
int lista2[] = new int[tamanho];

//Copia os dados da lista antiga para a nova lista
for (int i = 0; i < lista.length; i++)
lista2[i] = lista[i];

//Substitui a lista antiga pela nova
lista = lista2;
}

System.out.println(“Números lidos:”);
for (int numero : lista) {
System.out.println(numero);
}[/code]

fiz um exemplo simples veja:

import java.util.Scanner;

public class TesteJava {
	public static void main(String... args) {
		Scanner sc = new Scanner(System.in);
		int tam = 0;
		int num = -1;
		int[] vetor = new int[0];
		int[] temp = null;
		
		while ((num = sc.nextInt()) != -1) { // verifica se vai executar o laço
			temp = new int[++tam]; // cria um vetor temp maior e incrementa tam
			for (int i = 0; i < vetor.length; i++) { 
				temp[i] = vetor[i]; // copia todas posicoes do vetor
			}
			vetor = temp; // faz vetor apontar para o novo array com um espaço livre
			vetor[tam-1] = num; // finalmente poe o valor na ultima posicao
		}
	}
}

A quantidade de numeros inseridos é dada por vetor.length.
Lembrando que isso é só para fim acadêmico, e iniciante ainda…
Não use isso com coisas sérias. uaahuhas

[]'s

Para não ter problemas com o scanner lendo do system.in use apenas o nextLine

[quote=Blue]@Faicoxim

Obrigado pela resposta mas isso nesse exercicio especifico não me serve, amigão, não posso perguntar ao usuario a quantidade de elementos… infelizmente, mas obrigado!

@luciano

Cara, é Array mesmo! E pior que só tive umas 3 aulas de java, e a prof ja manda uma bomba dessa… mas é melhor pra aprender, to a tarde toda quebrando a cabeça nesse exercicio!

Gostei dessa ideia de copiar de um Array para o outro, nesse caso, basta eu fazer dois “for” que percorram os Arrays e usar a igualdade simples ?

Por exemplo, de uma olhada se esse codigo funcionaria de acordo com sua lógica, por favor

[code]
int x = new Int[500];

for (i = 0; i<x.length; i++) {
j = in.nextInt(); // << Aqui o usuario digitaria algo e verificaria se é negativo ou não
if (j < 0) break;
x[i] = z[i] } [/code]

Problema é, como que eu declararia o vetor Z (que seria o vetor “espelho”) ?

Muito obrigado!!![/quote]

Na verdade não foi bem isso a ideia que eu queria passar a ideia era declarar um vetor

int i[] = new int[2]

você lê até dois caracteres se o cara digitar mais um que seja diferente de um número negativo ai você intância o próximo vetor

int z[] = new int[i.length + 1]e fazer

System.arraycopy(i, 0, z, 0, i.length);

e depois passa colocar o valor lido na ultima posição de z e realoca i como mesmo tamanho de z e copia z para i

Não acho a melhor forma de resolver o problema, mas se é para usar array tem que ser assim.

tentei responder usando o mínimo de recursos possível, pq pelo que eu entendi é exercicio da facul…

ViniGodoy, fiquei curioso, qual tipo de problema pode-se ter quando não se usa o nextLine???

[]'s

Acho melhor usar Listas … é bem mais pratico

acredito que tambem seja possivel com Vectores mas daria mais trabalho

[quote=ruben_m]Acho melhor usar Listas … é bem mais pratico

acredito que tambem seja possivel com Vectores mas daria mais trabalho [/quote]
Com vetores é possível, para tal iras utilizar dois vetores:
-Vetor original
-Vetor da copia
O que fazes é o seguinte:
[color=darkblue]Inicio[/color]
Crias o vetor originar com tamanho 1
O vetor da copia com null
então inicia um ciclo:
recebe determina o tamanho da copia com o mesmo do original
copia o vetor origina para a copia
determina o tamanho do original uma unidade maior que a copia
copia o vetor copia para o original iniciando da posição 0 ate antes do tamanho da copia
introduz o novo valor na posição livre do original
fim do ciclo, verifica se satisfaz a condição
[color=darkblue]Fim[/color]

[quote=HelberChoo][quote=ruben_m]Acho melhor usar Listas … é bem mais pratico

acredito que tambem seja possivel com Vectores mas daria mais trabalho [/quote]
Com vetores é possível, para tal iras utilizar dois vetores:
-Vetor original
-Vetor da copia
O que fazes é o seguinte:
[color=darkblue]Inicio[/color]
Crias o vetor originar com tamanho 1
O vetor da copia com null
então inicia um ciclo:
recebe determina o tamanho da copia com o mesmo do original
copia o vetor origina para a copia
determina o tamanho do original uma unidade maior que a copia
copia o vetor copia para o original iniciando da posição 0 ate antes do tamanho da copia
introduz o novo valor na posição livre do original
fim do ciclo, verifica se satisfaz a condição
[color=darkblue]Fim[/color][/quote]

disse tudo Choo