比较两个不同List中不同对象的元素

时间:2012-11-02 20:27:36

标签: java

我会发布我的代码,但只需更改名称即可。当我可以添加更多信息时,我会添加评论。

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。所以他们是不同的对象,我认为这可能是问题。

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

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

3 个答案:

答案 0 :(得分:2)

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

  

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

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

如果你发现自己经常这样做,那么他们实施的抽象类可能会有所帮助。

答案 1 :(得分:1)

  

foo.contains(j.getId()))

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

最好是编写自己的方法来遍历列表并进行比较。您可以使用Guava,但这对于

来说会有点过分

答案 2 :(得分:0)

您可能希望有两张地图而不是列表。

代表foo

key: id
value: Object of AbstractA

代表names

key: id
value: Name object

然后你可以比较键(在你的情况下为id)

我希望我理解你。