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

これが予想外の答えを出している場合、考えられる原因は、 に対して定義されてequalsいる (または定義されていない) 方法にありEventDataます。特に、 をオーバーライドしていない場合はequals、からメソッドをEventData継承している可能性があります。そうする場合、「同じオブジェクト参照がある」ことを意味します。それはおそらくあなたのユースケースにとって間違ったセマンティックです。equalsObjectequals

于 2012-05-03T12:07:33.867 に答える
0

オーバーライドする必要がありますEventData.equals()。これを行ったら、 もオーバーライドする必要がありますhashCode()

最後に、 a を使用すると、すべてのチェックのコストがになるVectorため、計算の複雑さがかなり低下します。また、通常、新しいコードでの使用は推奨されません。contains()O(n)Vector

LinkedHashSet代わりに (または、要素の順序が重要でない場合は any )を使用することをお勧めしますSet

于 2012-05-03T12:11:38.343 に答える
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 に答える