Diminuir tamanho de array sem usar classes

14 respostas
Andre_Brito

Galera, tenho duas dúvidas.
A primeira é se existe alguma maneira de eu diminuir o tamanho de um array. Não estou importando classes nem nada e queria diminuir o tamanho de um array já existente. Tem como?

Gostaria de saber também se existe alguma função (ou alguma maneira de pensar) de fazer com que um número que está sendo comparado chegue perto de outro. Vamos supor que x vale 243,34. Preciso ver se ele chega perto de 174,43, vamos supor. Como fazer isso?

14 Respostas

Leandro_Carvalho

Você pode diminuir o array criando um outro array menor e copiando os dados um a um até chegar no tamanho que você quer…

Agora… número chegar perto??? Que isso? O que é “perto” pra você?

eros.stein

Já que precisa ser dinâmico, use Vector ao invés de array… quando se usa Vector a cada elemento adicionado ele aumenta de tamanho e a cada elemento retirado ele diminui de tamanho.

Iniciando um Vector com incremento de 1 em 1:

Vector vetor = new Vector(0,1); //adicionando itens: vetor.add(item);

Abraço.

eros.stein

Realmente ficou vaga sua intenção. O que deseja fazer? Tente ser mais claro.

Andre_Brito

eros.stein

Realmente ficou vago, peço desculpas. Essa do Vector eu não sabia… a galera não usa tanto isso, usa?

Eu já resolvi o problema de chegar perto galera, valeu :smiley:

Mais uma vez a família GUJ ajudando um nooba :smiley:

Abraços!

eros.stein

Bom se o pessoal não usa muito, não sei te dizer, mas deve-se usar Vector com cuidado, Vector é mais lento que array e trabalha com Object, não trabalha com tipos primitivos de dados. Mas eu uso ele em minhas aplicações sempre que necessário. Para trabalhar com vetores que precisam ter seu tamanho dinâmico não vejo melhor.

Abraço.

Ricardo_Siqueira

eros.stein:
Bom se o pessoal não usa muito, não sei te dizer, mas deve-se usar Vector com cuidado, Vector é mais lento que array e trabalha com Object, não trabalha com tipos primitivos de dados. Mas eu uso ele em minhas aplicações sempre que necessário. Para trabalhar com vetores que precisam ter seu tamanho dinâmico não vejo melhor.

Abraço.

Qual o objetivo do Vector aí?
Vector é serializable e absurdamente mais lento q ArrayList por exemplo. Se ele não precisa trabalhar com Threads sincronas ou qualquer coisa assim, porque usar Vector e não ArrayList?

eros.stein

Bom acho que isso responde sua pergunta:

:roll:

Ricardo_Siqueira

eros.stein:
dedejava:

Essa do Vector eu não sabia… a galera não usa tanto isso, usa?

Bom acho que isso responde sua pergunta:

:roll:

Mas ainda não entendi porque você usaria Vector.

ViniGodoy
eros.stein:
Já que precisa ser dinâmico, use Vector ao invés de array... quando se usa Vector a cada elemento adicionado ele aumenta de tamanho e a cada elemento retirado ele diminui de tamanho.

Iniciando um Vector com incremento de 1 em 1:

Vector vetor = new Vector(0,1);
//adicionando itens:
vetor.add(item);

Abraço.

Concordo com o pessoal. Muito melhor do que Vector é usar o ArrayList.

List<Integer> umaLista = new ArrayList<Integer>();
umaLista.add(1);
umaLista.add(2);
umaLista.add(3);
umaLista.add(4);

for (Integer numero : umaLista) {
   System.out.println(numero);
}

umaLista.remove(3);

for (Integer numero : umaLista) {
   System.out.println(numero);
}

Se você precisar "proibir" alterações na sua lista, ainda pode fazer:

List<Integer> imodificavel = Collections.unmodifiableList(umaLista);
imodificavel.add(10); //Isso dá um UnsupportedOperationException
E os benefícios do Vector ainda podem ser obtidos, somente nos trechos de código que interessam, assim:
List<Integer> threadSafe = Collections.synchronizedList(umaLista);

Moral da história: Use ArrayList no lugar de Vector

eros.stein

Se o problema é tempo, então nenhum dos dois deveria ser usado, mas sim array. Muitos programadores usam o Vector como padrão para coleções simples, pois é muito conveniente e simples de se usar.
Um ArrayList é cerca de 4 vezes mais rápido que um Vector, mas não tem a facilidade de implementação do mesmo. Mesmo assim, um array é cerca de 11! vezes mais rápido que um ArrayList, ou seja, se a aplicação é uma enorme “comedora” de memória nenhum dos dois é recomendado e sim o array. Eu dei o exemplo do Vector porque não acredito que a aplicação dele seja grande o suficiente para sentir a lentidão e pela enorme facilidade da implementação do Vector. Como a discussão entrou no mérito do tempo, achei interessante comentar este fato. As classes Vector e ArrayList são implementadas em termos de um array. Portanto, quando essas classes se redimensionam, um novo array é criado e tudo é copiado do array antigo para o novo. O objeto que originalmente não caberia é então incluído. Além disso Vector e ArrayList têm outro efeito colateral. Sempre que um elemento é removido deles, cada um dos outros itens em um índice maior que o elemento removido é movido para ter um índice um a menos que tinha antes da remoção. Conclusão

Considere o uso de um array no código crítico para o desempenho. Se você exigir a funcionalidade de um Vector, mas não seu sincronismo nem sua facilidade de implementação, use uma ArrayList. Use o Vector quando você exigir sua funcionalidade e seu sincronismo inerente.

Consultem: “Java - Guia Prático de Programação (Peter Haggar)” pgs 129-131.

ViniGodoy

Qual é a “facilidade de implementação” que você se refere que o Vector tem em relação ao ArrayList?

Até onde eu sei, ambos tem os mesmos métodos de acesso (implementam a mesma interface). O Vector ainda tem a desvantagem de ter métodos com funções redundantes, devido a herança histórica (addElement e add, por exemplo) e, se um desses métodos forem usados, você terá problemas se precisar altera-lo um qualquer outra coleção baseada na interface List, como a LinkedList. Os métodos históricos ainda te dão o inconveniente de ficar poluindo a lista de auto-completion da sua IDE.

Além disso, usar um array comum é realmente mais rápido desde que você implemente algoritmos mais eficientes do que os que estão dentro da classe ArrayList, o que geralmente não acontece. Pegue por exemplo o Collections.sort, que usa um algoritmo muito mais eficiente do que um programador normal, sem muita dedicação, faria. E, mesmo que esse programador fizesse, teria que manter o código depois. Claro, se sua aplicação tiver performance crítica, e se depois de rodar um profiler você notar que o problema é a implementação do ArrayList (e não algum algoritmo seu que usa o ArrayList), certamente você estará disposto a pagar esse preço.

O caso que você citou (inserção e remoção de itens) é um exemplo disso. A falha não estaria na implementação do ArrayList, mas no uso da coleção errada. Se sua aplicação faz muita inserção e remoção, é provável que você se beneficie substituindo a implementação por um LinkedList. O que será fácil se você usar corretamente a interface List e não os métodos históricos de Vector. Se os índices não interessam para você, então seria melhor ainda usar um Set, que pode inclusive ser ordenado e tem uma ótima performance para adição, remoção e pesquisa de itens. O tal “efeito colateral” que você citou é uma característica da coleção e, aliás, é o que motiva um List a ser um List.

Ainda assim, se você estiver numa das raríssimas situações em que um List precisa ser thread-safe, é provável que seja melhor usar uma das coleções do pacote java.util.concurrent, e não o Vector. Nesse caso, ter utilizado somente os métodos da interface List - e não os métodos históricos do Vector - vai ser novamente fundamental para uma migração fácil.

Ricardo_Siqueira

De fato…Vector é um elefante branco da 1.3 totalmente substituível.

eros.stein

A veemência com que os senhores condenam a utilização de Vector vai de total encontro a consagrados livros de Java:

“Core Java 2 Volume 1 - Fundamentos (Cay S. Horstmann, Gary Cornell)” pgs 165-176
OBS: No Core Java o autor inclusive RECOMENDA o uso de Vector principalmente para aplicações simples, como disse acreditar ser o caso do dedejava (pg 173).
“Java - Guia Prático de Programação (Peter Haggar)” pgs 129-131

Acredito que o Deitel e outros mais também tenham algo sobre isso, mas não vou procurar, estou abandonando esta discussão, os livros citados são reconhecidos por todos que já estudaram ou estudam Java, principalmente o Core Java.

Abraços a todos.

ViniGodoy

Ok. E a minha pergunta ainda está de pé. Qual é a facilidade ou a vantagem de se usar o Vector no lugar do ArrayList?

Por falar em Core Java, ele também recomenda o ArrayList em métodos não sincronizados:
“For that reason, we recommended the use of the ArrayList instead of the Vector class. However, if you do access a collection from multiple threads, it is very important that the methods are synchronized. For example, it would be disastrous if one thread tried to add to a hash table while another thread is rehashing the elements. The library designers could have implemented companion classes with synchronized methods for all data structures.”
Fonte: http://java.sun.com/developer/Books/javaprogramming/corejava/page5.html#INTRO3

E o final também mostra que é útil usar o Collection.synchronizedCollection, como eu falei. E, só para complementar, você ainda esqueceu de citar que ele põe a classe Vector no capítulo de legacy code (código legado).

Se você ler a documentação do Java, escrita por Joshua Bloch, autor da biblioteca de coleções e do livro Effective Java:
http://java.sun.com/docs/books/tutorial/collections/implementations/list.html

Perceberá que Vector nem sequer é citado como implementação de List. Ele vai ser citado apenas no capítulo “Interoperability” que trata sobre o que tiveram que fazer para suportar o código legado e uma das coisas foi adaptar (retroffit) o código para que se tornasse um List. Vector e Hashtable são tratados pelos autores como “old api” e só estão lá porque a Sun teve que dar suporte a dezenas de programadores que já tinham seus códigos implementados usando essas classes.

Lembrando: Este site aí é da documentação oficial. E acho que a documentação oficial, do site da própria Sun, fala por si só. Ele claramente recomenda o ArrayList sobre o Vector e novamente cita os wrappers como alternativa para a sincronização.

Criado 18 de setembro de 2007
Ultima resposta 19 de set. de 2007
Respostas 14
Participantes 5