大家好!我已经使用这个项目来记录一个棒球赛季,我用ArrayList的用法来解决这个问题:
。 。
private ArrayList<Team> list1 = new ArrayList<Team>();
Team something = new Team("Somename");
Team somethingelse = new Team("Someothername");
然后我使用了一些像:
这样的二传手something.setPoints(1);
somethingelse.setPoints(2);
然后:
list1.add(something);
list1.add(somethingelse);
但问题出现了:
int help1 = list1.indexOf(something);
System.out.println(help1);
返回-1
但列表包含这些对象:
for (Team d: list1) {
System.out.println(d);
}
输出是toString() - 我写给Team类的方法......
然后我用
尝试了ArrayList<Integer> list2 = new ArrayList<Integer>();
list2.add(1);
list2.add(2);
int help2 = list2.indexOf(1);
System.out.println(help2);
返回0
基本上我要问的是,当列表包含具有多个值的对象时,使用indexOf的正确方法是什么?
答案 0 :(得分:3)
答案 1 :(得分:2)
你需要覆盖哈希码和Team类的等号!
答案 2 :(得分:1)
根据indexOf
返回指定元素第一次出现的索引 此列表,如果此列表不包含该元素,则返回-1。更多 正式地,返回最低的索引i,使得(o == null?get(i)== null :o.equals(get(i))),如果没有这样的索引,则为-1。
因此,您基本上需要override
equals()
方法以及您想要匹配的内容,例如:
@Override
public boolean equals(object obj)
{
if(obj instanceof Team)
{
Team t = (Team) obj;
return t.getName().equals(this.getName());
}
return false;
}
此代码未经测试但应该可以满足您的需求。在这种情况下,如果两个团队名称相同,我认为两个团队是平等的。
答案 3 :(得分:0)
如果something
对象是相同的实例,那么一切都应该没问题,因为正在使用Object.equals
,对于同一个实例,它返回true。
但是,如果您要使用相同的值创建另一个对象,Object.equals
将返回false
。您需要实现考虑对象字段的equals
和hashCode
方法。