Java的; ArrayList <t> indexof </t>

时间:2013-04-22 11:46:42

标签: java

大家好!我已经使用这个项目来记录一个棒球赛季,我用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的正确方法是什么?

4 个答案:

答案 0 :(得分:3)

您需要覆盖Team课程中的equals方法。因此,当您执行list1.indexOf(something);时,indexOf方法知道如何找到对象something

答案 1 :(得分:2)

你需要覆盖哈希码和Team类的等号!

答案 2 :(得分:1)

根据indexOf

的Java文档
  

返回指定元素第一次出现的索引   此列表,如果此列表不包含该元素,则返回-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。您需要实现考虑对象字段的equalshashCode方法。