1

コードを投稿しますが、名前を変更するだけです。さらに情報を追加できるようになったら、コメントを追加します。

List<AbstractA> foo = bar.getFoo; // This returns an ArrayList<E> with two objects. Each object has an ID and Price. 

List<Name> names = null;
try{
   names = someClass.getNames(); // This returns an ArrayList<E> with 10 Name objects. Each one has an ID, name, description
}catch(Exception e){
   Log.warn(e);
}

私の主な目標は、2つのリストを比較することです。私は持っています...

Iterator<Name> object = names.iterator();
while(object.hasNext()){
   Name j = object.next(); // assign next name
   System.out.println("j.getId(): " + j.getId()); // This provides me the Id
   System.out.println("foo.contains(j.getId()) " + foo.contains(j.getId())); // Keeps spitting out false but I want it to be true

   if(foo.contains(j.getId())){
      object.remove(); //remove name out of Names list
   }
}

これが私がやろうとしていることを大いに理解できるかどうかはわかりません。このプログラムには、fooとnameを表す2つのBeanがあります。ですから、それらは異なるオブジェクトであり、それが問題かもしれないと思います。

助言がありますか?これが非常に曖昧な場合は申し訳ありません...

私の主な質問は、これら2つのリストの要素を比較したい場合、これを行うための最良の方法は何ですか?

4

3 に答える 3

2

List.contains(...)は、比較にequals()を使用します。

より正式には、このリストに(o == null?e == null:o.equals(e))のような要素eが少なくとも1つ含まれている場合にのみ、trueを返します。

equals()は、2つのオブジェクトが同じクラスである必要はないため、次のようにオーバーライドできます。

class Name {

    // Stuff

    @Override
    bool equals(Object other) {
        if(other instanceof Name) {
            Name otherName = (Name)other;
            // Compare this and otherName, return true or false depending
            // on if they're equal
        } else if (other instanceof AbstractA) {
            AbstractA otherAbstractA = (AbstractA)other;
            // Compare this and otherAbstractA, return true or false depending
            // on if they're equal
        } else {
            return false;
        }
    }
}

おそらく、両方のequals()をオーバーライドして、a.equals(b)== b.equals(a)にする必要があります。

これを頻繁に行っていることに気付いた場合は、両方が実装する抽象クラスが役立つ可能性があります。

于 2012-11-02T20:32:34.063 に答える
1

foo.contains(j.getId()))

fooisList<AbstractA>j.getId()is(私は推測する)a StringList.containsメソッドを使用するので、奇妙な方法で定義しない限り、equalsこれは決してありません。trueAbstractA.equals

リストを反復処理して比較する独自のメソッドを作成するのが最善です。使用できますGuavaが、これだけではやり過ぎでしょう

于 2012-11-02T20:35:17.543 に答える
0

リストの代わりに2つのマップが必要な場合があります。

のためにfoo

key: id
value: Object of AbstractA

のためにnames

key: id
value: Name object

次に、キーを比較できます(あなたの場合はid)

私はあなたを正しく理解したと思います。

于 2012-11-02T20:33:41.830 に答える