基本上我想创建一个“螺丝”类。这个类应该描述一个按类型,长度,厚度等的螺钉。我还想创建一个“存储”类,在所有方差中存储所述“螺钉”。类型,长度等限制为7和3(因此可能性有限)
public class Screws{
public Screws(int typ,double durchmesser,double laenge,double gangHoehe){
this.schraubenArt = typ;
this.durchmesser=durchmesser;
this.laenge=laenge;
this.gangHoehe=gangHoehe;
}
}
现在我想创建一个存储“单元”,这将是一个arraylist。我想用“螺丝”对象填充它。之后我希望能够检查列表中是否包含某个Scredobject。
import java.util.ArrayList;
public class Lager {
private Screws schrauben;
private ArrayList<Screws>Kreuzschlitzlager;
public Lager(){
Kreuzschlitzlager = new ArrayList<>();
for(int durchmesser=0; durchmesser <=3; durchmesser++){
for(int laenge=0; laenge <= 3; laenge++){
for(int ganghoehe=0; ganghoehe <=3; ganghoehe++){
Kreuzschlitzlager.add(new Screws (1,durchmesser,laenge,ganghoehe););
}}}}
public boolean checkForObject(Screws object){
return Kreuzschlitzlager.contains(object);
}
现在我的问题是,我得到一个很长的对象列表,我可以“获取”它的属性,但如果我checkForObject(Anything)它总是会给我一个“假”。我无法弄清楚为什么。不要担心类螺丝,它几乎没有完成。 :d 那么,我如何检查数组列表是否包含某个对象,为什么它在这种情况下不起作用,我可以用.IndexOf获取对象的索引吗?
答案 0 :(得分:4)
你是对的; Screws
课程尚未完成。 ArrayList
class calls the equals
method确定元素是否等于contains
的参数,但不要覆盖equals
。您的Screws
课程正在从equals
继承Object
,如果它是同一个确切的对象,则只返回true
。
覆盖equals
中的boolean equals(Object obj)
方法,签名Screws
。您需要编写用于确定自己平等的逻辑。
此外,contract for equals
表示需要与hashCode
保持一致。对于这个小应用程序,它没有必要,但通常你也应该覆盖hashCode
以与equals
保持一致。
答案 1 :(得分:1)
看一下List.contains的javadoc
boolean contains(Object o)
如果此列表包含指定的元素,则返回true。更多 正式地,当且仅当此列表包含至少一个时才返回true 元素e使得(o == null?e == null:o.equals(e))。
指定人:
中
包含在接口Collection参数:
,则返回true
o - 要测试此列表中存在的元素返回: 如果此列表包含指定的元素抛出:
ClassCastException - 如果指定元素的类型与此列表不兼容(可选) NullPointerException - 如果指定的元素为null且此列表不允许null元素(可选)
如果您没有为类螺丝指定等号方法,它会检查它们是否是同一个对象。定义一个等于方法。
答案 2 :(得分:0)
contains
方法执行此操作:
Returns true if this list contains the specified element. More formally, returns true if and only if this list contains at least one element e such that (o==null ? e==null : o.equals(e))
例如,我们初始化两个包含精确值的Screws对象。
Screws screws1 = new Screws(1, 1.0, 1.0, 1.0, 1.0);
Screws screws2 = new Screws(1, 1.0, 1.0, 1.0, 1.0);
Kreuzschlitzlager.add(screws1);
Kreuzschlitzlager.contains(screws2); // this returns false
默认只比较内存地址。 screws1和screws2具有不同的内存地址,因此它们不是同一个对象,并且它们不相等。您必须覆盖boolean equals(Object)
类中的int hashcode()
和Screws
,定义两个螺丝对象相等的方式
答案 3 :(得分:0)
在Screws
课程中,您需要覆盖方法equals(...)
并实现两个螺丝应该相等的方式