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

Java arraylist对象如何搜索元素错误,java,object,search,arraylist,collections,Java,Object,Search,Arraylist,Collections,我正在尝试使用ArrayList实现一个名为Parade的类,它将管理类小丑的实例。每个小丑都需要由所有对象数据字符串来标识其名称、int-id和double-size。我和一个新小丑一起走到游行队伍的尽头。只有在游行队伍前面的小丑(即第一个)才能离开游行队伍。此外,我编写了一个名为isFront的方法,该方法将小丑作为参数,如果传递的小丑在游行队伍的前面,则返回true,否则返回false。创建一个测试应用程序来演示如何构建一个由三个或四个小丑组成的游行队伍,并包含您自己的名字。然后,删除一个

我正在尝试使用ArrayList实现一个名为Parade的类,它将管理类小丑的实例。每个小丑都需要由所有对象数据字符串来标识其名称、int-id和double-size。我和一个新小丑一起走到游行队伍的尽头。只有在游行队伍前面的小丑(即第一个)才能离开游行队伍。此外,我编写了一个名为isFront的方法,该方法将小丑作为参数,如果传递的小丑在游行队伍的前面,则返回true,否则返回false。创建一个测试应用程序来演示如何构建一个由三个或四个小丑组成的游行队伍,并包含您自己的名字。然后,删除一个或两个,然后添加另一个或两个。另外,通过向isFront方法传递不同的小丑来测试isFront方法

我有一个代码,但是对于isFront方法,它并没有返回true,我尝试使用contains方法,我也尝试使用类似的接口小丑,但它没有工作得那么好。不知道该怎么办

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;
    }

}
import java.util.ArrayList;
公共班机
{
公共静态void main(字符串[]args)
{
游行马戏团=新游行();
马戏团小丑(新小丑(“Bobby”,9,12.0));
马戏团小丑(新小丑(“克莱尔”,2,11.0));
马戏团小丑(新小丑(“托尼”,6,10.0));
马戏团小丑(新小丑(“莎拉”,3,5.0));
马戏表演();
System.out.println(circus.isFront(新小丑(“Bobby”,9,12.0));
}
}
导入java.util.ArrayList;
公开课游行
{
私人静态ArrayList游行;
私人int top;
公众游行
{
top=0;
parade=newarraylist();
系统输出打印(阅兵);
}
公众小丑(小丑c)
{
(c)加入(c);
top++;
}
public void removeClown()/(小丑c)
{
移除(0);
顶部--;
}
公共空间显示()
{
系统输出打印(阅兵);
}
public void getData()
{
获得(0);
}
public void setData()
{
游行.布景(1,新小丑(“克莱尔”,2,5.0));
系统输出打印(阅兵);
}
公共int getTop()
{
返回顶部;
}
公共布尔isFront(小丑c)
{
return!parade.isEmpty()&&c.equals(parade.get(0));
}
//例外情况
}
公共课小丑
{
私有字符串名称;
私有int-id;
私人双户型;
公共小丑(字符串名称、int-id、双倍大小)
{
this.name=name;
这个.id=id;
这个。大小=大小;
}
公共字符串getName()
{
返回名称;
}
公共int getId()
{
返回id;
}
公共双getSize()
{
返回大小;
}
公共字符串toString()
{
返回name.toString()+id+size;
}
公共布尔等于(对象o){
如果(小丑c的o实例){
返回this.getName().equals(c.getName())&&this.getId()==c.getId()&&this.getSize()==c.getSize();
}
返回false;
}
}

在我们的教科书中,关于这些东西,他们没有太多的信息,Java Foundation 5 e Lewis喜欢使用对象和数组列表,它跳过了它,并假设您已经知道它,lol.

首先,默认情况下,Java中的对象是通过引用进行比较的。因此,即使您创建了两个具有完全相同属性的
小丑
对象,Java也会将它们视为不同的对象,因为这两个对象引用并不相同,它们都指向不同的内存位置。您可以通过重写
对象
类的
equals()
方法来重写此行为,并要求Java根据需要对其进行比较:

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));
}
如果游行队伍不是空的,并且小丑
c
等于游行队伍中的第一个小丑,则
isFront()
方法将返回
true
<代码>获取(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 c = new Clown("X", 1, 10);
 if ( c.equals(objectOfAnotherType) ) {..}
它仍然有效。 因此,我们使用
instanceof
操作符来检查另一个对象是否也是
小丑。如果它不是
小丑
的实例,我们返回
false
,但如果是,我们将该对象转换/强制转换为
小丑
,只有这样我们才能调用
getName()
和其他getter方法:

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()
时必须这样做。

您的源代码需要更好的格式。正确的缩进,并用空行分隔类。当我从ide粘贴它时,它是在它让我做了所有奇怪的格式化之后缩进的,它改变了它,不让我发布..在堆栈溢出上格式化代码非常简单,可以缩进4个空格,也可以用三个回号环绕。阅读帮助页面,点击现有问题/答案上的“编辑”按钮查看示例。您正在为isFront()调用创建一个新的小丑。只有重写小丑.equals()以测试两个小丑是否具有相同的数据时,这才有效;默认的equals()检查它们是否是相同的对象r