boa tarde, tenho uma duvida referente ao for que estou fazendo em um arraylist de objetos. Tenho um metodo for para alterar a minha lista que popula o rich:datatable, neste datatable existem duas colunas, uma de Justificativa e outra de Status, a alteracai da Justificativa funciona perfeitamente! mas a alteracao do Status não , segue o meu codigo para a alteracao:
Justificativa funciona perfeitamente:
public String alterarJustificativa() {
System.out.println(getPegaid());
for (JustificativaMB obj : listaJustificativa) {
int posicao = listaJustificativa.indexOf(obj);
if (posicao == getPegaid()) {
JustificativaMB objAux = obj;
obj.setDescricao("TEXTO MODIFICADO");
obj.setStatus("Ativo");
listaJustificativa.remove(objAux);
listaJustificativa.add(posicao, obj);
break;
}
}
return null;
}
Que complicado. Só uma perguntinha idiota. Eu queria saber se getPegaid() retorna o mesmo valor a cada vez que é chamada dentro do loop, ou se ficar retornando valores diferentes. Se retorna o mesmo valor a cada vez que é chamada dentro do loop, eu trocaria seu código:
for (JustificativaMB obj : listaJustificativa) {
int posicao = listaJustificativa.indexOf(obj);
if (posicao == getPegaid()) {
JustificativaMB objAux = obj;
obj.setDescricao("TEXTO MODIFICADO");
obj.setStatus("Ativo");
listaJustificativa.remove(objAux);
listaJustificativa.add(posicao, obj);
break;
}
}
por este aqui:
int posicaoAModificar = getPegaid();
if (0 <= posicaoAModificar && posicaoAModificar < listaJustificativa.size()) {
JustificativaMB just = listaJustificativa.get(posicaoAModificar);
just.setDescricao ("TEXTO MODIFICADO");
just.setStatus ("Ativo");
}
Viu? Muito mais rápido (porque não precisa de loop) e muito mais claro.
Em particular, o uso de indexOf que você fez no seu código é terrível, porque envolve uma busca linear, onde o método “equals” está sendo chamado para cada elemento da lista, o que é simplesmente muito lento se a lista for grande.
[quote=entanglement]Que complicado. Só uma perguntinha idiota. Eu queria saber se getPegaid() retorna o mesmo valor a cada vez que é chamada dentro do loop, ou se ficar retornando valores diferentes. Se retorna o mesmo valor a cada vez que é chamada dentro do loop, eu trocaria seu código:
for (JustificativaMB obj : listaJustificativa) {
int posicao = listaJustificativa.indexOf(obj);
if (posicao == getPegaid()) {
JustificativaMB objAux = obj;
obj.setDescricao("TEXTO MODIFICADO");
obj.setStatus("Ativo");
listaJustificativa.remove(objAux);
listaJustificativa.add(posicao, obj);
break;
}
}
por este aqui:
int posicaoAModificar = getPegaid();
if (0 <= posicaoAModificar && posicaoAModificar < listaJustificativa.size()) {
JustificativaMB just = listaJustificativa.get(posicaoAModificar);
just.setDescricao ("TEXTO MODIFICADO");
just.setStatus ("Ativo");
}
Viu? Muito mais rápido (porque não precisa de loop) e muito mais claro.
Em particular, o uso de indexOf que você fez no seu código é terrível, porque envolve uma busca linear, onde o método “equals” está sendo chamado para cada elemento da lista, o que é simplesmente muito lento se a lista for grande.
[/quote]
Realmente assim funciona mas, o status não é alterado:
[code]public String alterarStatus() {
int posicaoAModificar = getPegaid();
if (0 <= posicaoAModificar
&& posicaoAModificar < listaJustificativa.size()) {
JustificativaMB just = listaJustificativa.get(posicaoAModificar);
if (listaJustificativa.get(posicaoAModificar).status
.equals(“Ativo”)) {
just.setStatus(“Inativo”);
Pra finalizar esqueci uma coisa, a alteracao da justificativ aeu coloquei fixo, mas na verdade essa alteracao vem de um cam po de texto, mas não funciona :