向量中的问题

时间:2012-05-03 11:52:38

标签: java vector

我试图通过检查向量是否已经拥有数据来向向量添加一些数据,即使向量具有循环到达其他块的数据。

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 个答案:

答案 0 :(得分:1)

如果代码的行为不符合您的预期,则很可能您不了解contains实际上在做什么。

contains方法正在向量中查找equals方法所说的等于参数的元素;例如它(或多或少)相当于:

    boolean found = false;
    for (Object eventData : object) {
        if (eventData.equals(eCompare)) {
             found = true;
        }
    }

如果这给出了意想不到的答案,那么可能的原因就在于equals EventData的定义equals。特别是,如果您未覆盖EventData,则equals可以继承Object中的equals方法。如果是这样,那么{{1}} 意味着“具有相同的对象引用”。对于您的用例,这可能是错误的语义。

答案 1 :(得分:0)

您需要覆盖EventData.equals()。执行此操作后,您还应覆盖hashCode()

最后,使用Vector导致计算复杂度非常差,因为每contains()次检查费用O(n)。此外,在新代码中通常不建议使用Vector

您最好使用LinkedHashSet代替(或者,如果元素的排序不重要,则为Set)。

答案 2 :(得分:0)

正如评论中所讨论的,您的EventData似乎在两个向量中都是不同的实例。如果您希望它们在包含相同信息的意义上相等,则应根据识别它们的属性比较EventData个对象。 E.g:

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