2013-12-10 41 views
0

新手java学生在这里。我有一个ArrayList包含包含字符串和整数的对象。该对象的构造函数的结构如下MyClass(String, String, int, int, String)。我想在构造函数中使用String的第一个实例来查找ArrayList元素的索引,但是我很难理解如何去做。我试过使用indexOf(),但没有成功找到特定元素的索引。如果有人会指出我正确的方向,我将不胜感激。干杯获取各种数据类型ArrayList的索引

回答

1

您必须覆盖MyClass中的等于。 根据您想达到什么样的,你的equals方法看起来是这样的:

public boolean equals(Object o) { 
    if (o== null) return false; 
    if (!(o instanceof MyClass)) return false; 
    MyClass other = (MyClass) o; 
    if (other.firstString != null && this.firstString != null 
    && this.firstString.equals(other.firstString) return true; 
    return false; 
} 

编辑:你应该重写了hashCode为好。重写hashCode时,应考虑重写equals时考虑的对象。所以,如果你测试相等对两个MyClass的对象基于财产firstString,你应该inlcude firstString中的hashCode

public int hashCode() { 
    if (firstString == null) return 31; 
    return firstString.hashCode(); 

} 

EDIT2: 什么ArrayList中,当你调用的indexOf基本上是这样做: “为(Entry e = header.next; e!= header; e = e.next)if(o.equals(e.element)) return index; index ++; }'

因此,每次调用indexOf()时,ArrayList都会调用对象的equals方法。 因此,可以说,你有一个看起来像这样的列表:

MyClass m1 = new MyClass("this is some random string", other params); 
MyClass m2 = new MyClass("this is my target string", other params); 
MyClass m3 = new MyClass("this is irrelevant", other params); 

list.add(m1); 
list.add(m2); 
list.add(m3); 

现在,你想知道一个包含“这是我的目标字符串” MyClass的对象的索引。 所以你做出的indexOf一个电话:

list.indexOf(new MyClass("this is my target string"), other params); 

,并根据您的等于实现,它将返回1

+0

我正在查看教程,并试图理清如何将其应用于获取arraylist中特定元素的索引。 – Spud

+0

所以等于把这个和其他值进行比较并返回true或false。正确?哈希码使用素数来确定结果是否等于1?我想,我还没有真正想过。 – Spud

+1

当在集合中查找对象时,indexOf调用等于方法。如果您不覆盖equals,则会通过比较对象的引用来测试对象是否相等。换句话说,只有当它们是SAME对象时,两个对象才会被视为等于。 – Maggie

1

你必须看看如何覆盖你的班级中的equalshashcode方法。这是Collection的api用来执行这种操作的东西。

-1

不要以为你真的应该在列表中的离子来存储不同类型如果你能避免它的第一个地方?你真的有一个具有不同类型属性的对象列表吗?

相关问题