首页 > 解决方案 > ArrayList Contains with Object 总是返回 false

问题描述

这是我的代码:

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

我真的相信该方法存在错误,calculateStock()因为它总是返回 false,在该方法中,如果数组中的每辆自行车都是山地自行车的实例,calculateStock()我想将值添加到变量中。bikesSold

上面代码生成的输出:

Stock Levels
We have 0 mountain Bike in Stock
We have 10 Road bikes in Stock

Mountain Bike 始终为 0,尽管它已经在ArrayList.

预期的输出,如下所示:

Stock Levels
We have 4 Mountain Bikes in stock
We have 6 Road Bikes in stock

标签: javaobjectarraylistcontains

解决方案


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

不起作用,因为.contains(Object o)

当且仅当此列表包含至少一个元素e 满足 Objects.equals(o, e) 时才返回 true。

因此,只要列表中至少存在一个包含的实例(根据方法) ,bikes.contains(new MountainBike())就会始终返回。trueMountainBike .equals(Object o)bikes

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

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

推荐阅读