Array crescendo automaticamente

9 respostas
S

Pessoal,

Preciso fazer um programa que tenha um array de tamanho indefinido e vão crescendo de acordo com a quantidade de “adições” que o usuário faça. Daria pra fazer isso com ArrayList e Vecotr, porém não posso usar nenhum dos dois, como faço na mão para simples arrays serem criados com tamanho indefinido, digamos assim?

9 Respostas

DavidUser

Só pra quebrar um galho vou lhe dar um exemplo simples:
Fique claro que este é o mais simples, mas uns de maior custo que conheço.

minha classe guarda um atributo para um array de um tamanho x, sempre que o tamanho x esta prestes a ser alcançado eu crio um novo array maior e copio o velho para o novo e tomo o novo como o array da minha classe, este é o processo de crescimento, você deve manter outros atributos como o índice do ultimo elemento no array.

Da pra implementar de diferentes formas, depende do onde e para o que vai ser usada (depende dos requisitos), um livro bom sobre Algoritmos e Estrutura de dados é o “Algoritmos Teoria e Prática, Thomas H. Cormen, …”

DavidUser

leocantanhede

Seria algo mais o menos desta forma:

String [] palavras = new String [] {};

palavras[0] = "teste";
.
.
.
mi.rodrigues

Basicamente é o que DavidUser falou… Você coloca uma condição simples, quando o array x estiver completo você cria um novo array com 2x o tamanho anterior (tamanho arbitrário) e passa todos os dados para o novo array. Isso garante que seu array seja de “tamanho indefinido”.

rogeriopaguilar

Aqui tem alguns exemplos:

http://algs4.cs.princeton.edu/13stacks/

procura nesta página os itens “Array and resizing array implementations of collections”

S

rogeriopaguilar:
Aqui tem alguns exemplos:

http://algs4.cs.princeton.edu/13stacks/

procura nesta página os itens “Array and resizing array implementations of collections”

Não posso usar LinkedList nem nada desse tipo. Vou tentar seguir o conselho postado lá em cima.

Obrigado a todos.

rogeriopaguilar

Mas nos exemplos ele não utiliza linkedlist, não sei se chegou a ler o código de exemplo, mas o que ele faz é o que falaram lá em cima. Internamente ele redimensiona o array. Vou postar o link do código:

http://algs4.cs.princeton.edu/13stacks/ResizingArrayQueue.java.html

No método enqueue ele faz isso, dá pra ver pelo comentário:

public void enqueue(Item item) {
        // double size of array if necessary and recopy to front of array
        if (N == q.length) resize(2*q.length);   // double size of array if necessary
        q[last++] = item;                        // add item
        if (last == q.length) last = 0;          // wrap-around
        N++;
    }
B

Como o ArrayList aumenta sua própria capacidade:

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ArrayList.java#ArrayList.ensureCapacity(int)

sergiotaborda

Steam:
Pessoal,

Preciso fazer um programa que tenha um array de tamanho indefinido e vão crescendo de acordo com a quantidade de “adições” que o usuário faça. Daria pra fazer isso com ArrayList e Vecotr, porém não posso usar nenhum dos dois, como faço na mão para simples arrays serem criados com tamanho indefinido, digamos assim?

Só com array é impossivel em java. Todos os arrays em java têm um tamanho definido à priori.
O único truque é aquele que já lhe disseram, que é basicamente o que o ArrayList faz. Ou seja, quem lhe pediu isso, quer que vc crie um objeto que faz o mesmo que o ArrayList ( o que é si mesmo é uma tarefa meio exótica)

Para copiar os arrays use System.arrayCopy. Mais sobre como trabalhar com arrays, aqui

Criado 25 de fevereiro de 2013
Ultima resposta 26 de fev. de 2013
Respostas 9
Participantes 7