我试图通过检查向量是否已经拥有数据来向向量添加一些数据,即使向量具有循环到达其他块的数据。
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");
}
答案 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");
}
}