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

我的主要目标是比较这两个列表。我有...

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

我不确定这是否对我正在尝试做的事情有很大的意义。这个程序中有两个 bean 代表 foo 和 name。所以它们是不同的对象,我认为这可能是问题所在。

有什么建议么?对不起,如果这很模糊......

我的主要问题是,如果我想比较这两个列表中的一个元素,最好的方法是什么?

4

3 回答 3

2

List.contains(...)使用equals()进行比较:

更正式地说,当且仅当此列表包含至少一个元素 e 满足 (o==null ? e==null : o.equals(e)) 时,才返回 true。

equals() 不需要两个对象是同一个类,所以你可以像这样覆盖它:

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()))

fooList<AbstractA>并且j.getId()是(我猜) a String。由于List.contains使用该方法,除非您以奇怪的方式定义,否则equals永远不会。trueAbstractA.equals

最好的办法是编写自己的方法来遍历列表并进行比较。您可以使用Guava,但仅此而已

于 2012-11-02T20:35:17.543 回答
0

您可能想要两个地图而不是列表。

对于foo

key: id
value: Object of AbstractA

对于names

key: id
value: Name object

然后您可以比较密钥(在您的情况下为 id)

我希望我对你的理解是正确的。

于 2012-11-02T20:33:41.830 回答