2013-04-22 92 views
0

大家好!我已经与这个项目合作以保持棒球赛季的纪录,并且我用我的ArrayList用法面对这个问题:Java; ArrayList <T> indexof

。 。 。

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

所以基本上我所要求的是,当列表中包含具有m的对象时,使用indexOf的正确方法多重值?

回答

3

您需要覆盖Team类中的equals方法。所以当你做list1.indexOf(something);时,indexOf方法知道如何找到对象something

+1

无论何时重写均等考虑覆盖hashcode方法 – 2013-04-22 11:50:52

2

你需要重写散列码和等于Team类!

+2

对于ArrayList,Hashcode不是必需的,但如果覆盖两者,则优先考虑覆盖两者。 – Dariusz 2013-04-22 11:51:21

+0

无论您是使用arraylist还是hashmap,您的类规范都必须正确无误。为进一步阅读参考有效的Java项目9:当您覆盖等于时总是覆盖hashCode – 2013-04-22 12:31:24

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; 

} 

此代码是未经测试,但它应该做你所需要的。在这种情况下,如果他们有相同的名字,我认为两个球队是平等的。

0

如果something对象是相同例如全部通过你的榜样,一切都应该是很好的,因为Object.equals正在被使用,它返回相同的实例如此。

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

相关问题