tengo una ArrayList<Car>
encontrando en ArrayList
Por ejemplo
class Car{
String carName;
int carType;
}
Ahora, tengo que encontrar si la lista tiene carros que tienen mismo nombre. ¿Cuál es la mejor manera de hacer esto?
tengo una ArrayList<Car>
encontrando en ArrayList
Por ejemplo
class Car{
String carName;
int carType;
}
Ahora, tengo que encontrar si la lista tiene carros que tienen mismo nombre. ¿Cuál es la mejor manera de hacer esto?
Crear un comparador:
public class CarComparator implements Comparator<Car>
{
public int compare(Car c1, Car c2)
{
return c1.carName.compareTo(c2.carName);
}
}
Ahora suma todos los coches de la ArrayList
a un SortedSet
, preferiblemente TreeSet
; si hay duplicados se suman a la lista de duplicados:
List<Car> duplicates = new ArrayList<Car>();
Set<Car> carSet = new TreeSet<Car>(new CarComparator());
for(Car c : originalCarList)
{
if(!carSet.add(c))
{
duplicates.add(c);
}
}
Por último, en sus duplicates
tendrá todos los duplicados.
Anulación equals()
y hashCode()
métodos de su clase Car
y utilizar una aplicación Set
como HashSet
en lugar de ArrayList
.
no puedo tocar el coche object..I sólo el ArrayList de objeto Car entonces he de encontrar si alguna coches de la lista tiene el mismo nombre. ..... – Makky
Prueba esto:
List<Car> cars = getCars();
Set<String> names = new HashSet<String>();
for (Car car:cars) {
if (names.contains(car.getName()) {
duplicate(car); // some magic handler
} else {
names.add(car.getName());
}
}
Nota: esto le dará los nombres de coche que son duplicados. Un seguimiento en la que se extrae todos los coches con los nombres de la lista (si es necesario los objetos de coches)
vea el ejemplo anterior ... Gracias de todos modos – Makky
Esta solución es mucho mejor que la solución mejor votada. Este es o (n) algoritmo con o (n) espacio pero la otra solución es o (nlogn) –
Si tiene
class Car{
String carName;
int carType;
}
y
List<Car> list;
que contiene una lista de coches, entonces usted podría tener un método como
public static boolean hasDuplicates(List<Car> p_cars) {
final List<String> usedNames = new ArrayList<String>();
for (Car car : p_cars) {
final String name = car.carName;
if (usedNames.contains(name)) {
return true;
}
usedNames.add(name);
}
return false;
}
para averiguar si la lista de los automóviles tienen autos con nombres duplicados.
En general,' usedNames' debe ser un 'HashSet'; de lo contrario, obtendrá O (n) complejidad de cada comprobación. Con 'HashSet' obtienes O (1). – WindRider
@ Peri461 que era el título, la pregunta era "Tengo que encontrar si la lista tiene algún automóvil que tenga el mismo nombre" –
Muy bien, me disculpo. – Peri461
lo hice un programa similar que muestra las palabras que, cuando se repite en un ArrayList (también se muestra el contenido de ArrayList y la cadena más grande)
Ah, por cierto, las variables, y otras cosas como comentarios están en español, porque hablo español:/pero, si ves el código, puedes ver que resolví el problema con 2 bucles.
Este es mi resultado:
Ingrese un string: vaca
Ingrese un string: perro
Ingrese un string: dinosaurio
Ingrese un string: gato
Ingrese un string: cebra
Ingrese un string: DiNoSauRiO
Ingrese un string: VACA
Ingrese un string: hamster
Ingrese un string: gato
Ingrese un string: canario
Ingrese un string: elefante
Ingrese un string: tortuga
Ingrese un string: fin
Posicion: 0 del array: vaca
Posicion: 1 del array: perro
Posicion: 2 del array: dinosaurio
Posicion: 3 del array: gato
Posicion: 4 del array: cebra
Posicion: 5 del array: DiNoSauRiO
Posicion: 6 del array: VACA
Posicion: 7 del array: hamster
Posicion: 8 del array: gato
Posicion: 9 del array: canario
Posicion: 10 del array: elefante
Posicion: 11 del array: tortuga
vuelta nro: 0 del primer for
String: vaca no se repite con la posicion 1
String: vaca no se repite con la posicion 2
String: vaca no se repite con la posicion 3
String: vaca no se repite con la posicion 4
String: vaca no se repite con la posicion 5
el string vaca se repite en la posicion 6
String: vaca no se repite con la posicion 7
String: vaca no se repite con la posicion 8
String: vaca no se repite con la posicion 9
String: vaca no se repite con la posicion 10
String: vaca no se repite con la posicion 11
vuelta nro: 1 del primer for
String: perro no se repite con la posicion 2
String: perro no se repite con la posicion 3
String: perro no se repite con la posicion 4
String: perro no se repite con la posicion 5
String: perro no se repite con la posicion 6
String: perro no se repite con la posicion 7
String: perro no se repite con la posicion 8
String: perro no se repite con la posicion 9
String: perro no se repite con la posicion 10
String: perro no se repite con la posicion 11
vuelta nro: 2 del primer for
String: dinosaurio no se repite con la posicion 3
String: dinosaurio no se repite con la posicion 4
el string dinosaurio se repite en la posicion 5
String: dinosaurio no se repite con la posicion 6
String: dinosaurio no se repite con la posicion 7
String: dinosaurio no se repite con la posicion 8
String: dinosaurio no se repite con la posicion 9
String: dinosaurio no se repite con la posicion 10
String: dinosaurio no se repite con la posicion 11
vuelta nro: 3 del primer for
String: gato no se repite con la posicion 4
String: gato no se repite con la posicion 5
String: gato no se repite con la posicion 6
String: gato no se repite con la posicion 7
el string gato se repite en la posicion 8
String: gato no se repite con la posicion 9
String: gato no se repite con la posicion 10
String: gato no se repite con la posicion 11
vuelta nro: 4 del primer for
String: cebra no se repite con la posicion 5
String: cebra no se repite con la posicion 6
String: cebra no se repite con la posicion 7
String: cebra no se repite con la posicion 8
String: cebra no se repite con la posicion 9
String: cebra no se repite con la posicion 10
String: cebra no se repite con la posicion 11
vuelta nro: 5 del primer for
String: DiNoSauRiO no se repite con la posicion 6
String: DiNoSauRiO no se repite con la posicion 7
String: DiNoSauRiO no se repite con la posicion 8
String: DiNoSauRiO no se repite con la posicion 9
String: DiNoSauRiO no se repite con la posicion 10
String: DiNoSauRiO no se repite con la posicion 11
vuelta nro: 6 del primer for
String: VACA no se repite con la posicion 7
String: VACA no se repite con la posicion 8
String: VACA no se repite con la posicion 9
String: VACA no se repite con la posicion 10
String: VACA no se repite con la posicion 11
vuelta nro: 7 del primer for
String: hamster no se repite con la posicion 8
String: hamster no se repite con la posicion 9
String: hamster no se repite con la posicion 10
String: hamster no se repite con la posicion 11
vuelta nro: 8 del primer for
String: gato no se repite con la posicion 9
String: gato no se repite con la posicion 10
String: gato no se repite con la posicion 11
vuelta nro: 9 del primer for
String: canario no se repite con la posicion 10
String: canario no se repite con la posicion 11
vuelta nro: 10 del primer for
String: elefante no se repite con la posicion 11
vuelta nro: 11 del primer for
el array es: [vaca, perro, dinosaurio, gato, cebra, DiNoSauRiO, VACA, hamster, gato, canario, elefante, tortuga]
El array mas largo es: dinosaurio y tiene 10 caracteres
Los Strings repetidos son[vaca, dinosaurio, gato]
BUILD SUCCESSFUL (total time: 2 minutes 48 seconds)
¿Por qué no usar 'HashSet'. Proporciona o (1) para todas las operaciones, mientras que su opción 'TreeSet' es o (logn). ¿Me equivoco? –
Con sabor Java 8: ' Conjunto duplicación = Conjuntos.newHashSet(); Stream.of (car1, car2, car3) .sorted ([comparator]). Reduce ((car, car2) -> { if (car.equals (car2)) { duplication.add (car2); } return car2; }); System.out.println (duplicación); ' –
chaiyachaiya