Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] quitar repetidos de ArrayList

Estas en el tema de quitar repetidos de ArrayList en el foro de Java en Foros del Web. Necesito quitar los valores repetidos de un ArrayList sin utilizar otros objetos. Tengo el siguiente código: Código: public static void main(String[] args){ ArrayList<String> miArrayList=new ArrayList<String>(); ...
  #1 (permalink)  
Antiguo 25/04/2015, 03:30
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años, 7 meses
Puntos: 31
quitar repetidos de ArrayList

Necesito quitar los valores repetidos de un ArrayList sin utilizar otros objetos.

Tengo el siguiente código:
Código:
public static void main(String[] args){
	ArrayList<String> miArrayList=new ArrayList<String>();
	miArrayList.add("Uno");
	miArrayList.add("Dos");
	miArrayList.add("Tres");
	miArrayList.add("Uno");
	miArrayList.add("Cuatro");
	miArrayList.add("Uno");
	System.out.println("El tamaño inicial de miArrayList: "+miArrayList.size());
	System.out.println("Valores Iniciales de miArrayList: ");
	for (int i=0;i<miArrayList.size();i++)System.out.println("posición "+i+":"+miArrayList.get(i));
	for (int i=0;i<miArrayList.size();i++)for (int j=0;j<miArrayList.size();j++){
		if (miArrayList.get(i).equals(miArrayList.get(j))&&i!=j){
			miArrayList.remove(i);
		}
	}
	System.out.println("\nValores Finales de miArrayList: ");
	for (int i=0;i<miArrayList.size();i++)System.out.println("posición "+i+":"+miArrayList.get(i));
}
Y funciona correctamente para valores al azar. Sin embargo, cuando resulta que absolutamente todos mis valores son el mismo valor resulta que me deja 2 valores repetidos en vez de 1 solo. (Y esto me raya mucho porque debería de llegar un momento de comparación entre esos 2 valores. ¿Por qué no llega a comparar esos 2 valores?)
Para arreglarlo, después de finalizar el for de eliminación de repetidos he incluido la siguiente línea:
Código:
if (miArrayList.size()==2)if (miArrayList.get(0).equals(miArrayList.get(1)))miArrayList.remove(1);
Pero no me parece una solución muy fina a este problema.

¿A alguien se le ocurre alguna otra solución? ¿Quizá un (mientras haya un repetido borrar repetido)?

Última edición por Kritik; 25/04/2015 a las 03:48
  #2 (permalink)  
Antiguo 25/04/2015, 13:30
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: quitar repetidos de ArrayList

Buenas,

La forma más fácil (y que me he encontrado y he utilizado muchas veces) de eliminar repetidos en un arraylist es copiar a una coleccion como Set, que no admite repetidos, y volver a copiar de nuevo al ArrayList.

En tu caso:

Código Java:
Ver original
  1. Set<String> hs = new HashSet<>();
  2. hs.addAll(miArrayList);
  3. miArrayList.clear();
  4. miArrayList.addAll(hs);


Un saludo
__________________
If to err is human, then programmers are the most human of us
  #3 (permalink)  
Antiguo 27/04/2015, 09:20
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años, 7 meses
Puntos: 31
Respuesta: quitar repetidos de ArrayList

Bueno, eso es lo que había visto como solución en un montón de foros. Pero mi intención era no utilizar nuevos objetos. De momento me quedo con mi solución que no los utiliza.
  #4 (permalink)  
Antiguo 27/04/2015, 09:32
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 6 meses
Puntos: 306
Respuesta: quitar repetidos de ArrayList

Pues tu solución no es buena, me extraña que no te haya dado error.

http://stackoverflow.com/questions/1...m-list-in-java

No puedes eliminar un registro de una lista mientras la recorres, a menos que lo hagas con Iterator.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #5 (permalink)  
Antiguo 27/04/2015, 11:03
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: quitar repetidos de ArrayList

Cita:
mi intención era no utilizar nuevos objetos
No veo el motivo.

Tu solución es la peor opción posible, ya que, además de dar problemas de concurrencia como indica Xerelo, lo que haces es un producto cartesiano de complejidad cuadrática O(n^2), por lo que a nivel de rendimiento no puede escalar.

En cualquier caso es tu decisión.

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #6 (permalink)  
Antiguo 27/04/2015, 21:43
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años, 7 meses
Puntos: 31
Respuesta: quitar repetidos de ArrayList

Cita:
Iniciado por Profesor_Falken Ver Mensaje
No veo el motivo.
A lo mejor te parece un error de novato, pero si me equivoco avísame.

El motivo es que prefiero hacer más operaciones que no usar nuevos objetos que me van a ocupar más memoria pues necesito que mi programa ocupe la menor memoria posible en todo momento aun a costa de más operaciones.

En cuanto al error que comentais, (si no llego a leerlo no lo hubiese probado) he probado a ir aumentando 1 a 1 la cantidad de valores de mi arrayList... y me da error a partir de tener 9 valores o más. El error que me da es: java.lang.IndexOutOfBoundsException.

Entonces, dada mi intención de optimizar lo más posible el uso de memoria... es el iterator la mejor opción? Yo no tengo ni idea de como funcionan ni el iterator ni el HashSet, pero a simple vista me suena mucho mejor el iterator. Solo por el nombre y para lo que yo quiero hacer me suena mejor. Pero... me guio solo porque el nombre me suena mejor para lo que quiero hacer. Qué opináis vosotros?
  #7 (permalink)  
Antiguo 28/04/2015, 01:57
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 6 meses
Puntos: 306
Respuesta: quitar repetidos de ArrayList

A menos que pretendas ejecutar tu aplicación en un reloj casio, no entiendo tu obsesión con la memoria. Haz pruebas monitorizando el consumo de memoria y te darás cuenta. El uso excesivo de memoria se debe más a una mala programación que a crear objetos auxiliares.

Te recuerdo que un List sólo guarda referencias a los objetos, no los objetos en sí, por lo que cuando usas una lista auxiliar para guardar los objetos a borrar, únicamente estás incrementado el espacio de crear una lista.

La mejor opción, pues si pretendes tener una lista sin elementos repetidos lo lógico es usar el HashSet en vez de List, ya que esa es precisamente su función.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.

Etiquetas: arraylist, repetidos, valor
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:35.