Modificando somente um atributo do Vector

22 respostas
Heero

tem jeito de eu modificar apenas uma célula do Vector:
por exemplo eu tenho o objeto pessoa.
os atributos: cabelo, cor e peso.
e eu quero setar apenas o peso.
o que eu devo fazer???

eu tenho a classe pessoa que tem seu construtor

Pessoa (String cab, String cor, String pes)
 {
  this.cab = cab;
  ...
 }

public String getcab()
 {
  return cab;
 }

ai quando eu estou modificando, eu modifico tudo
por exemplo:

Vector vectPessoa;

vectPessoa.set(0, new Pessoa (
((Pessoa)vectPessoa.elementAt(0)).getcab(),
((Pessoa)vectPessoa.elementAt(0)).getcor(),
10
));

não tem um jeito mais facil?
tem jeito de modificar só peso sem eu fazer isso tudo? como?
expliquem, por favor.

22 Respostas

Rafael_Steil

Voce pode fazer assim:

Pessoa p = (Pessoa)vectPessoa.elementAt(0);
p.setCabelo("loiro");

a referencia vai ser atualizada normalmente.

E porque vc nao usa ArrayList ao inves de Vector?

Rafael

Heero

vc diz então pra eu cliar o metodo:

public void setcab(String cab) 
{ 
  this.cab = cab; 
}

tah certo o codigo?

tem q ter o set antes? por q?

ao inves do seu código

não seria mais interessante:

((Pessoa)vectPessoa.elementAt(0)).setcab("loiro");

anh?

Rafael_Steil

“Heero”:
vc diz então pra eu cliar o metodo:

public void setcab(String cab) 
{ 
  this.cab = cab; 
}

tah certo o codigo?

tem q ter o set antes? por q?

Se vc fizer os setXxx, vc pode mudar propriedades especificas… Da maneira como vc fez originalmente, teria que ficar recriando o objeto toda vez, o que nao eh legal.

“Heero”:

ao inves do seu código

não seria mais interessante:

((Pessoa)vectPessoa.elementAt(0)).setcab("loiro");

anh?

Soh seria mais “interessante” se voce somente fosse fazer uma unica alteracao. Se vc fosse alterar a cor e o cabelo, nao vale a pena ficar dando o elementAt() toda vez, ja que vc estaria fazendo buscas desnecessarias no vector.

Rafael

Heero

por que vc diz q não eh legal ficar recriando o objeto toda vez? mémoria? mais tempo de processamento? outros?

sempre tem q vir setXxx (onde Xxx eh alguma coisa), tem sempre q colocar setAlgumaCoisa, por q? por q não mudarXxx? anh?

Rafael_Steil

Nao ha motivo para voce recriar a instancia toda vez por simplesmente nao fazer sentido, nao haver necessidade para tal. Voce estaria “agredindo” o sistema ao fazer isso. Voce reconstruiria uma casa inteira sempre que precisasse repintar ou mudar alguma porta?

“Heero”:

sempre tem q vir setXxx (onde Xxx eh alguma coisa), tem sempre q colocar setAlgumaCoisa, por q? por q não mudarXxx? anh?

Eh nomenclatura padrao do Java, e requisito para certos frameworks. Leia http://java.sun.com/products/javabeans/docs/spec.html e vc ira entender.

Rafael

Heero

Obrigado mesmo!!!
valeu por tá me explicando!!!
legal sua explicação!
consegui compreender!
vou ler sobre o javabeans tbm!
tenho outra dúvida…
referente a testar se o Vector está vazio.

por q quando eu denomino o tipo e instancio:

Vector vectPessoa = new Vector();

não funciona o teste(pra testar se eh vazio) ou funciona eu q to fazendo errado:

if ((vectPessoa != null))

mas eu conseguir um jeito que é assim:

if(vectPessoa.size() > 0)

tah certo?
eh o melhor jeito?

Obrigado!

Rafael_Steil

Eh o unico jeito. A comparacao com null serve para verifica se o teu objeto ja foi instanciado. Por exemplo,

Vector v;
if (v == null) {
    // sim, eh nulo
}

agora, quando vc faz

v = new Vector();

o teu objeto ja nao eh mais null, e voce pode usar os metodos da classe.

Note que se vc tentar usar o objeto sem ter uma instacia, dara erro na hora de executar, o famoso NullPointeException.

E, mais uma vez, utilize a classe ArrayList ao inves de Vector. ArrayList, historicamente, eh mais rapida que Vector.

Rafael

TedLoprao

Lemrando que pro vazio vc pode usar o isEmpty() :wink:

Heero

Obrigado Rafael vc eh um bom mestre! Valeu tbm TedLoprao!!!
tem coisas que eu por exemplo, acredito tbm que muitos vão fazendo e não percebem os detalhes, pois estes saõ muito importantes, e agora eu to atentando bastante para os detalhes…

eu já li alguma coisa sobre ArrayList, mas nunca pus em prática, por que é mais interessante trabalhar com arrayList (além de ser mais rápida, isso com certeza já eh um ponto ótimo)? quais a diferenças sobre Vector? eh possivel eu interagir com o meu objeto Pessoa (visto acima) do mesmo esquema que Vector?

Obrigado!

Rafael_Steil

ArrayList eh uma “evolucao” de Vector, assim como HashMap eh uma evolucao de Hashtable.

Vector e Hashtable sao da primeira versao do Java. A partir do Java 1.2 foi introduzido o “framework Collections”, que eh um set de interfaces e classes para manipulacao de listas, maps e afins.
De uma boa estudada em

http://java.sun.com/docs/books/tutorial/collections/

Esse eh um dos pontos mais importantes - e basicos - que voce deve conhecer bem do Java.

Rafael

Heero

valeu! não sabia de nada disso!
o java eh muito poderoso!!!
dei uma passada de olho, o tutorial eh muito grande vou ler com mais calma
me adianta soh uns itens pra ver se compensa passar minha aplicação pra arrayList, coisa básica, se possivel…

1-no ArrayList eu posso trabalhar no mesmo esquema do Vector, por exemplo interagir com a classe pessoa que eu tenho abaixo?

2-ele trabalha com celulas? tipo no Vector tinha cabelo, cor e peso, minha celula 0 por exemplo podia ser vermelho, preto, 60 minha celula 1 poderia ser azul, marrom,65 e por ai vai…, no ArrayList funcionaria da mesma maneira celula 0 poderia ser vermelho, preto, 60 minha celula 1 poderia ser azul, marrom,65 e por ai vai, assim?

Rafael_Steil

Sim para tudo.

Rafael

Heero

andei dando uma lida e resolvi brincar de ArrayList

fiz um exemplo basico:

public class Teste
{
 ArrayList numero = new ArrayList();
 
 public Teste()
 {
   numero.add(1);
 }
....

tenho duas dúvidas:

é interessante eu tá instanciando um atributo como global --> "quando necessario"na hora que eu defino o tipo(eu soh programa assim, no exemplo tah assim), ou dentro do construtor ou dentro do metodo qeu eu vou usar ele ou tanto faz??? por q?

2- por q não aceita inteiro? como que eu faço pra por inteiro? interessante q aceita string…, e entrei na documentação e vi q tem q passar como parametro object, mas como q eu passo inteiro?

Heero

jah achei a resposta pra dúvida 2 …
eh:

numero.add(new Integer("1"));

isso?

agora tem a dúvida 1 (anterior) e outra:

como que eu comparo se eh diferente esse numero q eh um arraylist com o numero 2 por exemplo, tipo assim:

if (numero.get(0)!=2)

código acima errado!!!

eu sei q eu to comparando um objeto com um inteiro, mas como q eu faço essa comparação?

Rafael_Steil

O metodo get() retorna um Objet, e int nao eh Object. O teu item contem um Integer, logo a comparacao deve ser para tal:

if (new Integer(2).equals(numero.get(0))) {
    // sao iguais
}

Rafael

Heero

continuo voltando a mexer com ArrayList…
como que eu faço pra uma variavel int:

int teste;

receber um valor objeto de ArrayList???
pois o arraylist contém soh objetos certo? como q eu faço pra
uma variável inteira receber o conteudo na posição (0)??

jah tentei:

teste = numero.get(0);

e não funcionou e outras tentativas.

ajudem!
obrigado!

Heero

alguem saberia a resposta por favor?

Rafael_Steil
int teste = Integer.parseInt((String)lista.get(0));

Uma estudada nas classes basicas do Java vai te ajudar muito.

Rafael

Heero

o seguinte tah dando erro… (erro logico)
o meu arrayList dentro dele eh int
pois quando eu adiciono int:

lista.add(new Integer(i));

e eu tentei o seu comando e dah dando erro:

int teste = Integer.parseInt((String)lista.get(0));

vc tem certeza? ou sera q eh eu q to errando…

Valeu!

Rafael_Steil

hhmmm… meio obvio, nao?!.. se voce tem um Integer, tem que fazer cast para tal, ao inves de String… O meu codigo de exemplo, levando em consideracao o seu codigo, nao ira funcionar memso… sei la pq fiz cast para String… Voce tem que fazer cast para o tipo contido na posicao em questao, ou seja, Integer, no teu caso.

Rafael

Heero

deu não fera…
deu erro de compilação agora:

isso?

teste =  Integer.parseInt((Integer)lista.get(0));

nem esse aki funciona q eu pensei q ia dar:

teste =  Integer.parseInt((ArrayList)lista.get(0));

seguinte erro:
cannot resolve symbol

alguma solução? help. obrigado por está me ajudando!!!

Rafael_Steil

Para tudo… vamos por partes.

  1. http://java.sun.com/j2se/1.4.2/docs/api/
    Esse site eh seu amigo, e voce deve ter ele no Bookmark mais proximo

  2. Veja a classe Integer:
    http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Integer.html

Repare nos metodos que ela dispoe.

  1. ArrayList ( e qualquer outro derivado de List e afins ) atualmente soh aceita objetos como argumento para os metodos add/get

  2. Qual o tipo de objeto que voce inseriu? o seu cast deve ser para o mesmo tipo, na hora de recuperar o valor

  3. Fazer cast para um tipo incorreto dara erro na hora de rodar o teu programa ( ClassCastException )

Tendo essas informacoes basicas em mente, revise o seu codigo:

:arrow: Voce tem um objeto do tipo ArrayList, chamado numero, no qual, na posicao 0, voce adicionou um objeto do tipo Integer. Ou, em outras palavras, algo como

ArrayList numeros = new ArrayList();
numeros.add(new Integer(2));

Logo, se voce der um get(0), recebera um objeto do tipo Integer. Para comprovar isso, faca

System.out.println(numeros.get(0));

e veja o que imprime na tela.

:arrow: Como sabemos, voce tem um Integer. Entao, se fizer

(ArrayList)numeros.get(0);

voce tera um erro na execucao do seu codigo, ja que a posicao 0 contem um Integer, e nao um ArrayList.

:arrow: Voltando a classe Integer, de uma boa olhada nos metodos nela disponiveis. Algum lhe chama a atencao? que tal o metodo intValue()?? Vejamos o que a documentacao do metodo nos diz:

“Returns the value of this Integer as an int.”

Parece bem razoavel, nao?!..

:arrow: Faca um teste:

System.out.println(new Integer(10).intValue());

o que imprime? 10? 100? 45?

:arrow: Usamos o metodo intValue() para pegar o primitivo int contigo no objeto Integer.

:arrow: Juntando as pecinhas ate agora: Temos um objeto do tipo ArrayList, onde o primeiro item eh um objeto do tipo Integer, com o valor 2. Tambem sabemos que, para pegarmos o int desse objeto, devemos usar o metodo intValue().

:arrow: Consegue bolar o codigo para fazer isso funcionar? que tal

int x = ((Integer)numeros.get(0)).intValue()

funciona? que tal entao

Integer meuInteger = (Integer)numeros.get(0);
int x = meuInteger.intValue();

e esse, funciona?

A mesma “regra” aqui descrita vale para as outras situacoes.

Rafael

Criado 10 de junho de 2004
Ultima resposta 21 de jun. de 2004
Respostas 22
Participantes 3