Preciso "reaproveitar" um array!

7 respostas
N

Tenho um pequeno impasse para resolver:

Um vetor de objetos de certa classe:

ClasseX[] objetos = new ClassX[10];

Então crio esses objetos:

for(int i = 0; i < objetos.lenght; i++)
objetos[i] = new ClasseX();

Agora vem o problema. Em certa parte do programa, preciso aumentar o tamanho desse vetor de objetos. Algo assim:

ClasseX[] objetos = new ClassX[20];

Porém, na hora de criar os objetos, eu gostaria de aproveitar os 10 primeiros que eu já havia criado antes. Ou seja, a partir desse ponto eu só ia criar a partir do 11º objeto.

Como proceder?

Obrigado!

7 Respostas

E

Acho que nesse caso um ArrayList seria mais adequado.,mas, caso queira continuar usando um array, você pode usar o método estático System.arraycopy(). Abaixo tem um código de exemplo usando esse método, se quiser mais informações sobre ele clique aqui, ou caso queira usar um ArrayList clique aqui.

public class Exemplo
{
   public static void main(String[] args)
   {
      int[] array = new int[10];

      for(int i = 0; i < 10; i++)
         array[i] = i;

      System.out.println("Elementos de array:\n");

      for(int elementos : array)
         System.out.println(elementos);

      int[] novoArray = new int[20];

      System.arraycopy(array, 0, novoArray, 0, 10);

      System.out.println("\nElementos de novoArray:\n");

      for(int elementos : novoArray)
         System.out.println(elementos);
   }
N

Parece interessante, mas aí eu estaria criando um outro array e não é isso que eu preciso. Eu preciso “aumentar” o array que já foi criado, e além de usar as novas posições desse array, reutilizar as que já foram criadas…
Obrigado!

S

Acho que o melhor jeito é usar um ArrayList ou outra coleção.
Parece que você está precisando de uma lista encadeada.

N

Estou tentando usar Vector, mas o problema é que dentro desse Vector estou armazenando objetos de uma classe que eu criei.

Vector myVector = new Vector();

for(int i = 0; i < x; i++)

myVector.addElement(objeto);   // Objeto pertence a uma classe

// criada por mim.

Então, dentro de um for qualquer:

for(int i = 0; i &lt; myVector.size; i++)
   myVector.elementAt(i).myMethod();

Mas obviamente o “myMethod” não é reconhecido!

E agora?

L

Se tiver usando java 5 pode usar generics (aqueles tipos entre o <>, significa que o Vector é de elementos daquele tipo) :

Vector<String> v = new Vector<String>();
		v.add("obj1");
		v.add("obj2");

		for (String s1 : v) {
			System.out.println(s1.toUpperCase());
		}

No exemplo eu criei um Vector de objetos String, vc iria colocar o seu tipo…
Mas ao inves de usar vector, usa ‘List’ com ‘ArrayList’:

List<String> v = new ArrayList<String>();

Caso não esteja usando java 5, usa casting para converter o objeto (desde que vc tenha certeza que o objeto eh do tipo que vc vai fazer cast):

List v = new ArrayList();
		v.add("obj1");
		v.add("obj2");

		for(int i = 0; i < v.size(); i++) {
			String s = (String) v.get(i); //aqui ocorre o casting
			System.out.println(s.toUpperCase());
		}

Alterando o seu código, ficaria assim:

Sem java 5

public class MinhaClasse {
		private int num;

		MinhaClasse(int num) {
			this.num = num;
		}

		public void myMethod() {
			System.out.println(num);
		};
	}

         ....

	public static void main(String[] args) {

		Vector myVector = new Vector();
		for (int i = 0; i < 10; i++) {
			myVector.addElement(new MinhaClasse(i));
		}

		for (int i = 0; i < myVector.size(); i++) {
			Object o = myVector.elementAt(i);
			if (o instanceof MinhaClasse) {
				MinhaClasse mc = (MinhaClasse) o;
				mc.myMethod();
			}
		}
	}

Com java 5 (MinhaClasse é igual):

public static void main(String[] args) {

		Vector<MinhaClasse> myVector = new Vector<MinhaClasse>();
		for (int i = 0; i < 10; i++) {
			myVector.addElement(new MinhaClasse(i));
		}

		for (MinhaClasse mc : myVector) {
			mc.myMethod();
		}
	}
N

Nesse caso parece o erro:

for-each loops are not supported in -source 1.3
(try -source 1.5 to enable for-each loops)

Como isso é possível? Estou usando jdk 1.5.0 update 6.

N

Mais dois detalhes: Estou usando j2me, então creio que essas estruturas não podem ser utilizadas, tipo Collections, Lists, Generics, etc. Tenho que usar Vector mesmo.

Se trata de um jogo. O Vector recebe objetos de uma classe que extende Sprite. Isso ocorre somente uma vez e só ocorrerá de novo após um nvel ser finalizado. Ou seja, o Vector não pode ser preenchido toda hora e seu conteúdo DEVE ser visto por toda classe.

Sendo assim, o Vector possuirá objetos do tipo Sprite, portanto, preciso invocar os métodos da classe Sprite nesses objetos que estão dentro desse Vector. Algo assim:

for(int i = 0; i < myVector.size(); i ++)
myVector.elementAt(i).setPosition(x, y);

Onde setPosition é um método da Classe Sprite, e já que os objetos que estão dentro desse Vector são do tipo Sprite, eu imagino que podem ser invocados diretamente, mas não como fazer isso.
Ficaria inviável pegar todos os objetos que estão no Vector e convertê-los para objetos do tipo Sprite, porque muitos métodos são chamados dentro do loop principal, como teste de colisão, etc… Logo, a cada loop pegar uns 100 elementos de um Vector, criar 100 Objetos para receber esses 100 elementos e daí invocar o método correspondente a esses elementos…

E agora? Como usar corretamente o Vector para realizar essa tarefa?

Criado 8 de maio de 2007
Ultima resposta 9 de mai. de 2007
Respostas 7
Participantes 4