problema en vector
Frecuentes
Visto 99 veces
1
Estoy tratando de agregar algunos datos al vector verificando si el vector ya tiene los datos, incluso si el vector tiene los datos, el ciclo viene a bloquearse.
Vector object = (Vector) listUserEvents.get(key);
Vector compareEventData = (Vector) hCompareTable.get(compareKey);
for (int i = 0; i < compareEventData.size(); i++) {
EventData eCompare = (EventData) compareEventData.elementAt(i);
if (object.contains(eCompare)) {
System.out.println("in if of compare");
} else {
System.out.println("in else of compare");
}
3 Respuestas
1
Si el código no se está comportando como esperas, lo más probable es que no entiendas qué contains
está haciendo realmente.
La contains
método está buscando un elemento en el vector que el equals
el método dice que es igual al argumento; por ejemplo, es (más o menos) equivalente a:
boolean found = false;
for (Object eventData : object) {
if (eventData.equals(eCompare)) {
found = true;
}
}
Si esto está dando una respuesta inesperada, entonces la causa probable está en la forma en que equals
se define (o no) para el EventData
. En particular, si no ha anulado equals
, entonces EventData
podría estar heredando el equals
método de Object
. Si hace eso, entonces equals
significa "tiene la misma referencia de objeto". Esa es probablemente la semántica incorrecta para su caso de uso.
contestado el 03 de mayo de 12 a las 13:05
Aquí el objeto es un vector y eCompare es una clase de bean EvenData, no puedo usar para (EventData e: object), estoy tratando de ver si el vector del objeto tiene eCompare - harqs
@harqs - tienes razón. Hubo un error de compilación en mi código. Arreglado ahora. Sin embargo, el punto de mi código NO es que lo uses. El punto es EXPLICARLES cómo el contains
método FUNCIONA. - Stephen C
0
Necesitas anular EventData.equals()
. Una vez que haga esto, también debe anular hashCode()
.
Finalmente, usando un Vector
da como resultado una complejidad computacional bastante pobre ya que cada contains()
consultar costos O(n)
. Además, usando Vector
generalmente no se recomienda en el código nuevo.
Estarías mejor usando LinkedHashSet
en su lugar (o, si el orden de los elementos no es importante, cualquier Set
).
contestado el 03 de mayo de 12 a las 13:05
0
Como se discutió en los comentarios, su EventData
parecen ser instancias diferentes en ambos vectores. Si espera que sean iguales en el sentido de que contienen la misma información, debe comparar los EventData
objetos basados en una propiedad que los identifica. P.ej:
Vector<EventData> object = (Vector<EventData>) listUserEvents.get(key);
Vector<EventData> compareEventData = (Vector<EventData>) hCompareTable.get(compareKey);
for (EventData eCompare : compareEventData) {
boolean found = false;
for (EventData other : object) {
if (other.getSomeProperty().equals(eCompare.getSomeProperty())) {
found = true;
break;
}
}
if(found){
System.out.println("contains");
}else {
System.out.println("does not contain");
}
}
contestado el 03 de mayo de 12 a las 13:05
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas java vector or haz tu propia pregunta.
¿Son el mismo objeto (como en la misma instancia)? Si no, ¿son iguales y hashcode correctamente implementados? Nota al margen: ¿necesita usar un Vector (vs. arraylist por ejemplo)? - assylias
Eche un vistazo al método equals de EventData. El método contiene solo devolverá verdadero si dos objetos son iguales. Probablemente tenga nuevos objetos EventData, por lo que no son iguales al método Object.equals() predeterminado. - morja
no he implementado equals y hashcode - harqs
Bueno, entonces los objetos EventData en ambos vectores son diferentes y, por lo tanto, nunca ingresa al bloque if. - morja
¿Qué contienen los objetos EventData? Si hay algo que identifique el evento, podría usarlo para comparar los objetos. - morja