método add de um List

1 - É possível ter uma list de um objecto do meu tipo, aonde cada vez que adicione um objecto, ele substitua um objecto já existente, em vez de adicionar no fim da lista?

Por exemplo:

List<MyObject> l = new ArrayList<MyObject>();
MyObject m1 = new MyObject()
MyObject m2 = new MyObject()
l.add(m1);
l.add(m2);

System.out.println(l.size()); <--- tamanho 1.

O MyObject é um objecto serializável e com bastantes variáveis de tipos criados por mim.

Se eu não me engano implementações de Map fazem algo parecido com o que você quer.
Quando você atribui algum valor à alguma chave já existente, o valor antigo é substituído pelo novo.

Acredito que desse modo dará certo

Object objeto=new Object();
Object objeto2=new Object();
List<Object> objs=new ArrayList<Object>()
objs.add(objeto);
int i=objs.indexOf(objeto);
objs.add(i, objeto2);

[quote=pedrosacosta]1 - É possível ter uma list de um objecto do meu tipo, aonde cada vez que adicione um objecto, ele substitua um objecto já existente, em vez de adicionar no fim da lista?

Por exemplo:

List<MyObject> l = new ArrayList<MyObject>();
MyObject m1 = new MyObject()
MyObject m2 = new MyObject()
l.add(m1);
l.add(m2);

System.out.println(l.size()); <--- tamanho 1.

O MyObject é um objecto serializável e com bastantes variáveis de tipos criados por mim.

[/quote]

Olá.
Qual o critério para se substituir determinado objeto em determinada posição?

Isso quer dizer que quando se faz um add num ArrayList, o método vai gerar uma chave que é o apontador para o objecto e é esse apontador que é inserido na lista?

Ele se eu não me enganado verifica usando o método equals ou o hascode;
Então acho interessante que você sobrescreva esses dois métodos desses dois objetos.

 @Override
    public boolean equals(Object obj) {
//codigo
}
  @Override
    public int hashCode() {
//codigo
}

[quote=pedrosacosta]Isso quer dizer que quando se faz um add num ArrayList, o método vai gerar uma chave que é o apontador para o objecto e é esse apontador que é inserido na lista?

[/quote]
Acho que não é bem assim…

Quando se faz um add em um ArrayLIst ele coloca na próxima posição, por exemplo:

[code]List alunos = new ArrayList();
alunos.add(joao);
alunos.add(jose);
System.out.println(alunos.get(1).getNome);
System.out.println(alunos.get(2).getNome);
alunos.set(2, marcos);
System.out.println(alunos.get(2).getNome);

Resultado:
João
José
Marcos[/code]
Ou seja, o valor passado para os metodos get/set (o índice) é apenas a posição do elemento na lista…

Só salientando é que o índice começa pelo 0 e não pelo 1

Olá pedrosacosta,

Primeiramente vc deve sobrescrever os métodos equals e hascode do seu MyObject, em seguida vc pode utilizar o Set para adicionar somente objectos distintos em sua coleção, evitando objetos duplicados com o meso valor ou que seja equivalentes…

Veja:


 Set<MyObject> colecao = new HashSet<MyObject>();  
 MyObject m1 = new MyObject()  
 MyObject m2 = new MyObject()  
 colecao .add(m1);  
 colecao .add(m2);  
  
 System.out.println(colecao.size()); <--- tamanho 1.

Espero ter ajudado!
Fallow Abraço

Você ainda não disse qual o critério para substituir.

[quote=raf4ever]Olá.
Qual o critério para se substituir determinado objeto em determinada posição?[/quote]

Existem duas formas:
Se você souber o objeto que você quer retornar e não sabe a posição dele, você utiliza:

minhaLista.indexOf(meuObjeto);

Se você tem o índice do seu objeto no array mas não o tem, você deve utilizar o método get()

minhaLista.get(posicaoObjeto);