我会发布我的代码,但只需更改名称即可。当我可以添加更多信息时,我会添加评论。
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。所以他们是不同的对象,我认为这可能是问题。
有什么建议吗?对不起,如果这很模糊......
我的主要问题是,如果我想比较这两个列表中的元素,那么最好的方法是什么?
答案 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()))
foo
是List<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)
我希望我理解你。