Foro sobre Java SE > Error ArrayList.add() - Repeticion Elementos
me cuesta leer tu codigo por el no identado que no facilita la página javahispano.org... la verdad que se necesita esto. queda muy atrás siendo que muchos blogs tienen esta posibilidad y justo esta página tan consultada no la tenga...
prueba utilizar siempre los iterator para recorrer colecctions... yo tuve problemas cuando quise recorrerlas a tu manera... y puede que vaya por ahi... puedes llevarte una sorpresa
Hola Emanuel
He probado con iterator, collections pero nada de nada. He localizado el problema pero no encuentro un solucion por el momento.
El objetoc itihr = new PricedItinerary(); tiene variables static pero no puedo cambiar dicha clase ya que se autogenera desde la importacion de un web service.
Gracias por la sugerencia.
Pongo un ejemplo
La siguiente clase al ejecutarla me imprime nueve veces 9, cuando necesito que imprima el valor 0,1,2,3,4,5,6,7,8,9.
El codigo al.add(new MyInt(i)); me sobreescribe las variables anteriores.
Hay alguna forma de conseguir este resultado sin tener que omitir static de la variable i de la clase MyInt.
class MyInt {
private static int i;
public MyInt(int ii) {
i = ii;
}
public void increment() {
i++;
}
public String toString() {
return Integer.toString(i);
}
}
public class Test {
public static void main(String[] args) {
ArrayList al = new ArrayList();
for (int i = 0; i < 10; i++) {
al.add(new MyInt(i));
}
for (int i = 0; i < 10; i++) {
System.out.println(al.get(i));
}
}
}
por ahora en mi vida me maneje solo con java SE... programo hace poco... así q de webservices no entiendo nada. pero bueno, el intento se hace.. no podes agregar variables ni modificar el comportamiento de toString()? sino podrías hacer con una variable que se incrementara y toString() imprime esa... no podeś abrir objetos para agregar nada a ellos con java, si la recibis de un objeto solo podés trabajar con lo q te ofrece... (en ruby esto se puede hacer, por cosas así amo ese lenguaje)... lo que se me ocurre es que crees una clase y jugando con la herencia, trates de lograr lo que buscas.. si la clase la importas de donde sea (no entiendo nada de web services), crea una clase que sea hija o padre(no se) y modifica el comportamiento de esa hija o padre... no se, desde mi humilde ignorancia.. saludos desde Argentina
Creo que no acabas de comprender el concepto de variable static.
Las variables static son exactamente la misma para todos los objetos de la clase.
Cada vez que haces new MyInt(valor) le asignas a TODOS los objetos MyInt el mismo valor.
No entiendo porque dices que quieres hacer lo mismo sin eliminar static de la variable. No tiene sentido.
Salut
Si esa clase autogenerada declara el precio como estático, -aparte de lo dudoso del procedimiento-, es porque espera que todas las posibles instancias de la misma tengan el mismo precio. Es una manera un tanto discutible de declarar una variable como inmutable.
Si la declaración de la clase no se puede modificar, la única solución que veo, a vista de pájaro, es que crees otra clase diferente para procesar la suma de precios.
Hola Paposo y Choces
El concepto de static lo comprendo perfectamente, el problema lo tengo al usar Web Services. Al usar wsimport me genera las clase con sus propiedades y metodos (get y set) estaticas.
Esta clase no puedo modificarla, he intentado crear una nueva clase con extends y clonnable para copiar objetos pero no hay manera.
Seguire buscando si encuentro una solucion os enviare un post.
Saludos cordiales.
Manuel
Extender o clonar esa clase no resuelve el problema, puesto que heredará las propiedades de la original.
A lo que me refiero es a crear una clase independiente, con la misma estructura que la original, pero con variables no estáticas, copiarle los datos de la original, y procesar la nueva, en vez de la original.
Hola Choces
He creado una nueva clase como comentas sin las propiedades ni metodos estaticas pero al asignar la nueva clase a la clase generara por el web service me da error.
He intentado hacer un cast pero tampoco.
Gracias por la sugerencia.
Saludos
Manuel
Prueba a usar los getters de la original, para rellenar los valores de la nueva.
Se trataría de hacer una "copia" de datos entre clases, de manera que al procesar los precios de la nueva, no modifique las variables estáticas de la original.
Tu problema, únicamente, es que la lista no guarda un objeto, la lista guarda una referencia que apunta al espacio en memoria donde esta almacenado el objeto. Tu estas sobrescribiendo el objeto, por lo cual cuando insertas un nuevo elemento, en realidad esta almacenando la misma referencia al mismo objeto, pero ahora editado, lo que debes hacer es crear una nueva instancia del objeto cada vez que requieras hacer un .add a la lista. (Crear un nuevo registro)
Saludos compañeros!
Efectivamente Luis Enrique le dio al problema
"Tu estas sobrescribiendo el objeto, por lo cual cuando insertas un nuevo elemento, en realidad esta almacenando la misma referencia al mismo objeto, pero ahora editado, lo que debes hacer es crear una nueva instancia del objeto cada vez que requieras hacer un .add a la lista. (Crear un nuevo registro)"
Yo tenia el mismo problema y cree un nuevo objeto y use lo set para llenarlo antes de hacer el ADD y listo cuando hago el FOR ya me aparecen todos los objetos que guarde en lugar de repetirse el último que guarda N cantidad de veces.
Hola Natán.
Temo que no.
Lo que esta diciendo Luis Enrique es lo que le hemos dicho a Manuel tanto Choces como yo, pero jamás resolvería el problema porque un campo static comparte la misma referencia para todas las instancias.
Manuel esta creando nuevas instancias pero hagas lo que hagas con una instancia los datos static son exactamente los mismos.
Un saludo,
Paposo
Hola a Todos
Me estoy volviendo loco con encontrar una solucion al siguiente problema.
Tengo un ArrayList<Itinerarios> al cual le añado nuevos objetos Itinerarios pero el ultimo Itinerario que añado al ArrayList me sobreescribe los demas que he añadido.
Si añado a la lista de itinerarios Itinerario 1, Itinerario 2, Itinerario 3. La lista contiene 3 objetos itinerarios pero los 3 objectos tienen el valor del ultimo elemento añadido.
Itinerario 1 (precio 150 euros)
Itinerario 2 (precio 200 euros)
Itinerario 3 (precio 250 euros)
La lista me devuelve tres itinerarios con el mismo precio (250 eruos). Cada nuevo objeto aque añado al ArrayList.add() esta instanciado con new Itinerario.
Os paso parte del codigo, he mirado en foros, google pero nada de nada estoy bloqueado con esto:
public PricedItineraries construirVuelosRT(PricedItineraries it1, PricedItineraries it2) {
PricedItineraries itines = new PricedItineraries();
PricedItinerary iti = null;
PricedItinerary itihr = null;//itinerario holder
ArrayList<PricedItinerary> lista= new ArrayList<PricedItinerary>();
int contRPH = 1;//contador rph
BigDecimal prec1, prec2;
for (int i = 0; i < it1.getPricedItinerary().size(); i++) {
//obtenemos el itinerario
iti = it1.getPricedItinerary().get(i);
//obtenemos el precio
prec1=iti.getPrecio();
for (int k = 0; k < it2.getPricedItinerary().size(); k++) {
itihr = new PricedItinerary();
itihr.setAirItinerary(iti.getAirItinerary());
itihr.setAirItineraryPricingInfo(iti.getAirItineraryPricingInfo());
itihr.setSequenceNumber(iti.getSequenceNumber());
prec2=it2.getPrecio();
itihr.setPrecio(prec1.add(prec2));
//añadimos el Itineraio nuevo a la lista de PricedItineraries
lista.add(itihr);
//aumentamos el contado
contRPH++;
}//fin for k
}//fin for i
return itines;
}