新手java学生在这里。我有一个ArrayList,其中包含包含字符串和整数的对象。对象的构造函数的结构类似于MyClass(String, String, int, int, String)
。我想在构造函数中使用String的第一个实例找到ArrayList元素的索引,但我很难理解如何去做。我已经尝试使用indexOf()
但是没有成功找到特定元素的索引。如果有人能指出我正确的方向,我将不胜感激。干杯
答案 0 :(得分:1)
您必须查看如何覆盖班级中的equals
和hashcode
方法。这是Collection
的api用于执行此类操作的内容。
答案 1 :(得分: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时考虑的对象。因此,如果基于属性 firstString 测试两个MyClass对象是否相等,则应该在hashCode中包含 firstString
public int hashCode() {
if (firstString == null) return 31;
return firstString.hashCode();
}
EDIT2: 调用indexOf时ArrayList的作用基本上是这样的: 'for(Entry e = header.next; e!= header; e = e.next){ if(o.equals(e.element)) 回报指数; 索引++; }“
因此,每次调用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);
并且,根据您的 equals 实现,它将返回1.
答案 2 :(得分:-1)
如果可以避免,首先不要认为你应该首先在列表中存储不同的类型?你真的拥有一些具有不同类型属性的对象列表吗?