Vetor ilimitado?

Sou novo no forum e estou com o seguinte problema:
Esse programa tem uma função: ler 30 numeros e os dividir em pares ou ímpares. A solução que eu achei foi criar dois vetores, uma para recer os pares e outros para os impares, mas se eu colocar um tamanho neles, na hora de imprimir os elementos do vetor, os indices que estiverem em branco, também são impressos, como faço para ele imprimir somente os indices que tem algo armazenado, ou então como crio um vetor que determine seu limite após ser preenchido??

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class numero3{
	public static void main(String[] args){
		BufferedReader dadEnt = new BufferedReader (new InputStreamReader(System.in));			
		int vi []= new int [30]; int ivi=0;  	// vetor impar, indice vetor par     
		int vp []= new int [30]; int ivp=0;	// vetor par, indice vetor par	        		
		String n=""; 	          				// numero		
		double r=0;     	  						// resto		
		int n2=0;	
		System.out.println("Digite um valor:");	
		for (int i=0; i<30; i++){		
		try{
                n= dadEnt.readLine();
		n2= Integer.parseInt(n);}
		catch (IOException ex){}
		r=n2%2;
		if(r==1){
			vi[ivi]=n2;
			ivi++;}
		if(r==0){
			vp[ivp]=n2;
			ivp++;}
		}
		System.out.println("Impares digitados:");		
		for(ivi=0; ivi<vi.length;ivi++){
			System.out.print(vi[ivi]+", ");}
			System.out.println(" ");
		System.out.println("Pares digitados:");		
		for(ivp=0; ivp<vp.length;ivp++){			
			System.out.print(vp[ivp]+", ");}
}
}

Utilize uma collection em conjunto de uma classe wraper para encapsular os números.

… Como faço isso ? Comecei a programar tem pouco tempo, não faço a menor ideia do que seja!

veja isto.

t+

Para vetores infinitos use ArrayList.

Bem… existem classes que, em sua implementação interna, ela faz o gerenciamento dos vetores para você. Caso chegue no limite do vetor, ela recria ele, passando os valores para esse novo vetor com um tamanho menor. Isso dá a impressão que ela seja um vetor ilimitado. Tudo que você precisa fazer são métodos de add (adicionar o elemento), get (pegar o elemento pelo índice, como você faz com vetor comum), remove (remover elemento, por indice ou o proprio elemento), size (pega o ‘length’ do vetor), entre outros. Tem até metodos para copiar um ‘vetor’ para dentro de outro.

Essas classes que fazem isso, estão na API Collection. A que usa vetor como se fosse um vetor mesmo, são chamadas de LISTAS, na verdade. São várias implementações delas. E tudo isso que te expliquei, usando vetor mesmo, são ArrayList ou Vector. Porque também existem listas ‘linkadas’, etc. Enfim, encare elas como listas ordenadas mesmo. Futuramente você vai conhecer outras estruturas de dados.

O detalhes delas, é que só armazenam Objetos. Não armazenam variáveis primitivas. Então, ao invés de usar int, você deve usar Integer (uma classe que encapsula a variável primitiva ‘int’ como um objeto.

Não dá para explicar com muito mais detalhes, mas basicamente é isso. Te sugiro usar ArrayList.

Oque o amigo ali encima dice é:

[code]ArrayList<Integer>array = new ArrayList<Integer>();

	Integer i = new Integer(10);
	int i2 = 9;
	Integer i3 = 8;
	
	array.add(i);
	array.add(i2);
	array.add(i3);
	array.add(7);[/code]

geovanni…Tanto faz ser List ou ArrayList…Todos fazem parte de Collection.

veja:

List lista = new ArrayList(); //aqui eu crio um objeto list do tipo arraylist generico
ArrayList lista = new ArrayList(); //aqui eu crio um objeto arraylist do tipo arraylist generico.

t+

Sim , até poderia usar Vector , é que ouvi falar que o ArrayList é mais recomendado. ^^

Mas no caso dele , tanto faz. =D

Vector é melhor no caso do uso de Threads, por ser Thread-Safe.

Consegui fazer com o ArrayList!
Vlwww! \o/

Prefiro criar uma Lista Thread-Safe com a utilização da Collections a usar um Vector.

Bom, eu pensei em outra solução sem usar lists. Ta, essas infos podem ou devem estar inormadas nos códigos das lists ( ou não). ams enfim, vá lá, minha idéia:

Criar + 2 variáveis no cabeçalho do código q armazenem a qtd. de posições já ocupada, masi ou menos dessa forma:

[code]public clss exemplo {
static int VlorDasPoisçõesOcupadasPar;
static int VlorDasPoisçõesOcupadasImpar;
// Toda a kctada de código já vista

[/code]

Porém, nos métodos de adição, ao no final de execução adiciona 1 em cada posição, mais ou menos dessa forma:


public void adicionaPar(int valor){

//não declarei a matrix lá encima, mas creio que da pra entender o modo q eu escrevo aqui

MatrixDePares[VlorDasPoisçõesOcupadasPar] = this.valor;
VlorDasPoisçõesOcupadasPar++;
}

public void adicionaImpar(int valor){

// o mesmo para este método

MatrixDePares[VlorDasPoisçõesOcupadasImpar] = this.valor;
VlorDasPoisçõesOcupadasImpar++;
}

Ai, na hora de imprimir, ficaria dessa forma:


for(int i = 0; i <VlorDasPosiçõesOcupadasPar +1; i++){
System.out.println(MatrixDePares[i]);
}

Não vou escrever o de ímpares, pq o efeito é o mesmo. Espero que tenha sido útil o q escrevi aqui( e que tambem esteja tudo correto).

[]'s

OBS: Pq deixar as 2 variáveis q criei aqui como static? Pq o método main é “static”, e como você aprenderá mais pra frente, métodos static não usam atributos não-static.
Outra: Com os arraylist e List da vida, funcionam muito bem, claro. Menos código pra escrever, menos alterações… Bom, é só uma outra forma de ver o mesmo problema. =D

[]'s.

Só se seu monitor for o Vector, caso contrário, não é thread-safe.
E mesmo assim, prefiro a solução que o nel disse: