java - 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
解决方案
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())
就会始终返回。true
MountainBike
.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;
}
推荐阅读
- python - 如何安装 djangoshop-sendcloud?
- node.js - 如何用 Mocha & Chai 模拟函数调用结果?
- abap - 在 ABAP 中将文字文本动态转换为字符串模板
- php - 运行 laravel docker shift 从 5.3 到 5.4 和 5.4 到 5.5 有问题
- php - 文件上传选项以从相机拍摄图像或从画廊中选择不适用于 Mozilla Firefox 中的 Web 应用程序
- c++ - 在 Visual Studio C++ 中链接多个库
- oracle - 为什么在相同类型/宽度的列之间复制数据时出现“ORA-12899: value too large for column”错误?
- r - R中按日期汇总总小时数
- azure-data-explorer - 在物化视图中按用户名和时间戳查找下一条记录,而无需在 Kusto 中序列化数据
- asp.net-core - 无法在 NavMenu 中加载数据