1

我正在尝试通过检查向量是否已经具有数据来向向量添加一些数据,即使向量具有循环即将进入 else 块的数据。

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

3 回答 3

1

如果代码未按预期运行,则很可能是您不了解contains实际在做什么。

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

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

如果这给出了一个意外的答案,那么可能的原因是equalsEventData. 特别是,如果您没有覆盖equals,那么EventData可能是equalsObject. 如果这样做,则equals 意味着“具有相同的对象引用”。对于您的用例,这可能是错误的语义。

于 2012-05-03T12:07:33.867 回答
0

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

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");
    }
}
于 2012-05-03T12:13:47.187 回答
0

您需要覆盖EventData.equals(). 完成此操作后,您还应该覆盖hashCode().

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

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

于 2012-05-03T12:11:38.343 回答