java arraylist对象如何搜索元素错误

643ylb08  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(386)

我正在尝试使用arraylist实现一个名为parade的类,它将管理类小丑的示例。每个小丑都需要用所有对象数据字符串来标识其名称、int id和双倍大小。我和一个新小丑一起参加游行。只有列队头的小丑(即第一个)才能离开列队。此外,我还编写了一个名为isfront的方法,该方法将小丑作为参数,如果传递的小丑位于游行队伍的前面,则返回true,否则返回false。创建一个测试应用程序来演示如何构建一个由三个或四个小丑组成的游行队伍,并包含您自己的名字。然后,去掉一个或两个,再加上一个或两个。另外,通过将不同的小丑传递给isfront方法来测试isfront方法。
我有一个代码,但它不是返回真的isfront方法,我试图使用包含方法,我也试图使用类似的接口小丑,但它没有工作得很好。不知道该怎么办。

import java.util.ArrayList;
public class Main
{
    public static void main(String[] args)
    {
        Parade circus = new Parade();

        circus.addClown(new Clown("Bobby",9,12.0));
        circus.addClown(new Clown("Clair", 2, 11.0));
        circus.addClown(new Clown("Tony",6,10.0));
        circus.addClown(new Clown("Sarah",3,5.0));
        circus.display();
        System.out.println(circus.isFront(new Clown("Bobby", 9, 12.0)));

    }

}
import java.util.ArrayList;
public class Parade
{
   private static ArrayList<Clown> parade;
   private int top;
   public Parade()
   {
      top=0;
      parade= new ArrayList<Clown>();
      System.out.println(parade);

   }
   public void addClown(Clown c)
   {
     parade.add(c);
     top++;
   }
   public void removeClown()   //(Clown c)
   {
     parade.remove(0);
     top--;
   }
   public void display()
   {
     System.out.println(parade);
   }
   public void getData()
   {
      parade.get(0);
   }
   public void setData()
   {
      parade.set(1,new Clown("Claire",2,5.0));
      System.out.println(parade);
   }
   public int getTop()
   {
      return top;
   }
   public boolean isFront(Clown c)
   {
      return !parade.isEmpty() && c.equals(parade.get(0));
   }

   //exceptions
}

public class Clown
{
    private String name;
    private int id;
    private double size;

    public Clown(String name, int id, double size)
    {
        this.name=name;
        this.id=id;
        this.size=size;
    }
    public String getName()
    {
        return name;
    }
    public int getId()
    {
        return id;
    }
    public double getSize()
    {
        return size;
    }
    public String toString()
    {
        return name.toString() + id + size;
    }
    public boolean equals(Object o) {
        if (o instanceof Clown c) {
            return this.getName().equals(c.getName()) && this.getId() == c.getId() && this.getSize() == c.getSize();
        }
        return false;
    }

}

他们在我们的教科书中没有太多关于这些东西的信息,比如使用对象和数组列表,它跳过它,假设你已经知道了,哈哈。。

ia2d9nvy

ia2d9nvy1#

首先,默认情况下,java中的对象是通过引用进行比较的。所以,即使你创造了两个 Clown 具有完全相同属性的对象,java将它们视为不同的对象,因为这两个对象引用不相同,它们都引用不同的内存位置。您可以重写这个行为,并通过重写 equals() 方法 Object 班级:

public class Clown {
    private String name;
    private int id;
    private double size;

    public Clown(String name, int id, double size) {
        this.name=name;
        this.id=id;
        this.size=size;
    }
    public String getName() {
        return name;
    }
    public int getId() {
        return id;
    }
    public double getSize() {
        return size;
    }
    @Override
    public boolean equals(Object o) {
        if (o instanceof Clown) {
             Clown c = (Clown) o;
             return this.getName().equals(c.getName());
        } 
        return false;
    }
    @Override
   public int hashCode() {
        return this.getId();
    }
    @Override
    public String toString() {
        return name.toString() + id + size;
    }
}

这将有助于 contains() (它内部使用 equals() ). 第二,你可以把你的小丑和第一个小丑比较一下,看看是不是前面的那个:

public boolean isFront(Clown c) {
    return !parade.isEmpty() && c.equals(parade.get(0));
}

这个 isFront() 方法将返回 true 如果游行不是空的,小丑 c 等于游行中的第一个小丑。 get(0) 找回游行队伍中的第一个小丑。根据您的评论,如果您希望两个小丑只有在其所有属性相等时才相等,请将equals方法更改为:

@Override
public boolean equals(Object o) {
   if (o instanceof Clown) {
         Clown c = (Clown) o;
         return this.getName().equals(c.getName()) &&
                this.getId() == c.getId()          &&
                this.getSize() == c.getSize();
    } 
    return false;
}

这个 equals() 方法是 Object 类,它是所有java类的父类。它定义了如何比较两个对象。签字如下:

public boolean equals(Object obj)

当我们重写时,它的签名在派生类中必须是相同的,在我们的类中是相同的 Clown . 其参数的类型为 Object 不是 Clown . 任何类型都可以转换为 Object ,如果我比较 Clown 另一种类型,例如:

Clown c = new Clown("X", 1, 10);
 if ( c.equals(objectOfAnotherType) ) {..}

它仍然有效。所以我们使用 instanceof 运算符检查另一个对象是否也是 Clown . 如果它不是 Clown ,我们回来 false 但如果是,我们将该对象转换/强制转换为 Clown ,只有这样我们才能打电话 getName() 以及其他吸气剂方法:

if (o instanceof Clown) {
         Clown c = (Clown) o; //Casting happens here
         return this.getName().equals(c.getName()) &&
                this.getId() == c.getId()          &&
                this.getSize() == c.getSize();
    } 
    return false;

java 14为此引入了一个快捷方式,而不是以下步骤:

if (o instanceof Clown) {
         Clown c = (Clown) o;

我们可以简单地写下:

if (o instance of Clown c)

它为我们铸造并储存在 c .
最后,我还重写了 Object.hashCode() 因为当你超控的时候你必须这么做 equals() ,原因如下。

相关问题