Java ArrayList Contains with Object始终返回false

Java ArrayList Contains with Object始终返回false,java,object,arraylist,contains,Java,Object,Arraylist,Contains,这是我的密码: package bikeproject; import java.util.ArrayList; import java.util.Random; public class BikerList { public static void main(String[] args) { ArrayList<Bike> bikes = new ArrayList<Bike>(); int mountainBikeSale

这是我的密码:

package bikeproject;

import java.util.ArrayList;
import java.util.Random;

public class BikerList {
    public static void main(String[] args) {
        ArrayList<Bike> bikes = new ArrayList<Bike>();

        int mountainBikeSales = 0;
        int roadBikeSales = 0;

        fillArray(bikes);

        displayStock(bikes);

//      calculateStock(bikes);
        System.out.println(displayBkeNumbers(bikes));
    }

    static void fillArray(ArrayList<Bike> bikes) {
        Random rand = new Random();
//      int number = 2;
//      int a = rand.nextInt(2);

        for (int i = 0; i < 10; i++) {
            if (rand.nextInt(2) < 1) {
//              System.out.println(rand.nextInt(2));
                bikes.add(new MountainBike());
            } else {
//              System.out.println(rand.nextInt(2));
                bikes.add(new RoadBike());
            }
        }
    }

    static void displayStock(ArrayList<Bike> bikes) {
        for (Bike bike : bikes) {
            System.out.println(bike);
        }
    }

    static int calculateStock(ArrayList<Bike> bikes) {
        int bikesSold = 0;
        for (Bike bike : bikes) {
            if (bikes.contains(new MountainBike())) {
                bikesSold++;
            }
        }
        return bikesSold;
    }

    static String displayBkeNumbers(ArrayList<Bike> bikes) {
        int mb = 0;
        int rb = 0;

        mb = calculateStock(bikes);
        rb = bikes.size() - mb;

        return "\nStock Levels" + "\nWe have " + mb + " mountain Bike in Stock" + "\nWe have " + rb
                + " Road bikes in Stock";
    }
}
山地车始终为0,尽管它已在
ArrayList

预期输出,如下所示:

Stock Levels
We have 4 Mountain Bikes in stock
We have 6 Road Bikes in stock
if(bikes.contains(new MountainBike())
创建一个新对象并检查它是否已在列表中。不是

您需要执行类似于
if(Mountainbike的自行车实例)
的操作

有更好的方法,但这会解决您的问题。

如果(bikes.contains(new MountainBike())创建一个新对象并检查它是否已在列表中,则此
。不是

您需要执行类似于
if(Mountainbike的自行车实例)
的操作

有更好的方法,但这会解决您的问题。

静态int-calculateStock(ArrayList-bikes){
int bikesSold=0;
用于(自行车:自行车){
if(bikes.contains(new MountainBike()){//行
bikesSold++;
}
}
返回车票;
}
不起作用,因为:

当且仅当此列表包含至少一个元素,使得Objects.equals(o,e)等于时,返回true

因此,
bikes.contains(new MountainBike())
将始终返回
true
,只要
bikes
列表中至少包含一个
MountainBike
实例(根据
.equals(Object o)
方法)

相反,您应该检查当前对象是否是您想要检查它的特定类型的实例(
MountainBike
,在本例中),如下所示:

Stock Levels
We have 4 Mountain Bikes in stock
We have 6 Road Bikes in stock
static int-calculateStock(数组列表){
int bikesSold=0;
用于(自行车:自行车){
if(山地自行车的自行车实例){
bikesSold++;
}
}
返回车票;
}
static int calculateStock(数组列表){
int bikesSold=0;
用于(自行车:自行车){
if(bikes.contains(new MountainBike()){//行
bikesSold++;
}
}
返回车票;
}
不起作用,因为:

当且仅当此列表包含至少一个元素,使得Objects.equals(o,e)等于时,返回true

因此,
bikes.contains(new MountainBike())
将始终返回
true
,只要
bikes
列表中至少包含一个
MountainBike
实例(根据
.equals(Object o)
方法)

相反,您应该检查当前对象是否是您想要检查它的特定类型的实例(
MountainBike
,在本例中),如下所示:

Stock Levels
We have 4 Mountain Bikes in stock
We have 6 Road Bikes in stock
static int-calculateStock(数组列表){
int bikesSold=0;
用于(自行车:自行车){
if(山地自行车的自行车实例){
bikesSold++;
}
}
返回车票;
}


我们需要查看
自行车的代码。可能您没有正确实现
equals()
。您正在检查列表中是否包含您刚刚创建的山地自行车,而该山地自行车肯定不在列表中。您应该使用
if(MountainBike的bike实例){…}
而不是contains。但是,这不是一个好方法。问题是calculateStock()总是返回false,我确信它不应该是@Giorgi TsiklauriPlease,请显示您的自行车代码。已向您提出请求。已编辑。谢谢@giorgitsiklauri我们需要查看
自行车的代码。可能您没有正确实现
equals()
。您正在检查列表中是否包含您刚刚创建的山地自行车,而该山地自行车肯定不在列表中。您应该使用
if(MountainBike的bike实例){…}
而不是contains。但是,这不是一个好方法。问题是calculateStock()总是返回false,我确信它不应该是@Giorgi TsiklauriPlease,请显示您的自行车代码。已向您提出请求。已编辑。谢谢@GiorgiTsiklauriI我很好奇为什么这会被否决?除了
Mountainbike
之外,Mountainbike
应该是
Mountainbike
。这完全忽略了如果Bike以某种方式实现equals方法,那么
contains
方法实际上会起作用。我猜这就是这个练习的重点。我认为,
Bike
可以覆盖
contains
,甚至不调用
equals
,在这种情况下,这种方法对于代码的reads@DontKnowMuchButGettingBetter除了返回this.class==other.class
,equals的什么实现将使它工作?基本上OP问了一个问题,缺乏足够的信息来回答它关于
Bike#equals
,因此这个答案就解决了问题是,我很好奇为什么这会被否决?除了
Mountainbike
之外,Mountainbike
应该是
Mountainbike
。这完全忽略了如果Bike以某种方式实现equals方法,那么
contains
方法实际上会起作用。我猜这就是这个练习的重点。我认为,
Bike
可以覆盖
contains
,甚至不调用
equals
,在这种情况下,这种方法对于代码的reads@DontKnowMuchButGettingBetter除了返回this.class==other.class,equals的什么实现将使它工作?基本上OP问了一个问题,缺乏足够的信息来回答它关于
Bike#equals
,因此这个答案就解决了这个问题。