0

大家好!我已经使用这个项目来记录棒球赛季,并且我在使用 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);
 }

输出是我写给 Team 类的 toString() 方法......

然后我尝试了

ArrayList<Integer> list2 = new ArrayList<Integer>();

list2.add(1);

list2.add(2);

int help2 = list2.indexOf(1);
System.out.println(help2);

返回 0

所以基本上我要问的是,当列表包含具有多个值的对象时,使用 indexOf 的正确方法是什么?

4

4 回答 4

3

您需要覆盖类equals中的方法Team。因此,当您这样做时list1.indexOf(something);,该indexOf方法知道如何定位对象something

于 2013-04-22T11:48:35.940 回答
2

您需要覆盖 Team 类的 hashcode 和 equals !

于 2013-04-22T11:50:02.207 回答
1

根据Java docindexOf

返回此列表中指定元素第一次出现的索引,如果此列表不包含该元素,则返回 -1。更正式地说,返回满足 (o==null ? get(i)==null : o.equals(get(i))) 的最低索引 i,如果没有这样的索引,则返回 -1。

因此,您基本上需要使用您想要匹配的任何方法,例如overrideequals()

@Override
public boolean equals(object obj)
{
     if(obj instanceof Team)
     {
          Team t = (Team) obj;
          return t.getName().equals(this.getName());
     }
     return false;

}

此代码未经测试,但它应该可以满足您的需求。在这种情况下,如果两个团队名称相同,我认为它们是相等的。

于 2013-04-22T11:50:36.247 回答
0

如果该something对象在整个示例中都是同一个实例,那么一切都应该没问题,因为Object.equals正在使用,它为同一个实例返回 true。

但是,如果您正在创建另一个具有相同值和所有值的对象,Object.equals则将返回false. 您需要实现一个考虑您的对象字段的equalsand方法。hashCode

于 2013-04-22T11:51:31.423 回答