problema en vector

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");
}

preguntado el 03 de mayo de 12 a las 12:05

¿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)? -

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. -

no he implementado equals y hashcode -

Bueno, entonces los objetos EventData en ambos vectores son diferentes y, por lo tanto, nunca ingresa al bloque if. -

¿Qué contienen los objetos EventData? Si hay algo que identifique el evento, podría usarlo para comparar los objetos. -

3 Respuestas

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

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

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 or haz tu propia pregunta.