我已经检查了所有地方,并在Java中找不到与我的问题类似的答案。我使用的是数组,而不是数组列表。
每次在我的CoffeeShop上下新订单时,都必须将CoffeeShop添加到客户访问过的一系列商店中,但是即使他们访问过两次说“星巴克”,也只能出现一次。
我有一个主文件,一个CoffeeShop类和一个Customer类,这三个文件在OOP中都可以协同工作。
我觉得我的问题源于我是如何从CoffeeShop类中向我的客户类发送CoffeeShop对象的(如果发送“ this”是适当的,也就是AKA),或者是我如何将CoffeeShop添加到其中的数组中“ addStore()”方法(如果索引“ i”正在执行我认为正在执行的操作,则也可以)。
这是我的代码,将CoffeeShop对象添加到商店的客户列表中,主要看起来是这样的:
secondCup.newOrder(bruno, latte); //bruno is a Customer object, latte is a Drink object.
在我的CoffeeShop类中,新的订单实例方法如下:
public void newOrder(Customer c, Drink d)
{
/*
double t = markUp*d.calculateCost();
DrinkOrder o = new DrinkOrder(c, d, t);
orders[pendingOrders++] = o;
currentProfit += t - d.calculateCost();
tracker[trackerSize++] = c;
totalOrders++;
*/ //above is irrelevant
c.addStore(this); //Here is where im adding the store that called the 'newOrder()' method
}
我认为“这”应该是名为“ .newOrder()”的特定咖啡店,但主要是在其他商店调用newOrder()时,说:
starBucks.newOrder(bruno, latte);
当我打印拜访的商店阵列时,我得到2秒杯,而不是第二个杯子和一个星巴克(我认为这是因为我是如何将CoffeeShop发送到addStore()或将商店追加到所访问的商店的阵列)。
这是我的方法,应检查存储是否已存在于数组中,如果不存在,则应将其添加到数组中:
public void addStore(CoffeeShop shop)
{
size++;
for (int i=0; i<size; i++)
{
if (visited[i] == null) //if the first position is null (which it will be, add their first shop visited
{
visited[i] = shop;
break;
}
else if (visited[i].equals(shop)) //if if the index of the array equals the shop passed, then break the loop AKA dont add it to the array
{
break;
}
else //if none of the positions equal the shop, add it to the array
{
visited[i] = shop;
}
}
}
我尝试使用do while,如下所示,但是我得到的输出与上面的尝试完全相同:
for (int i=0; i<size; i++)
{
do
{
visited[i] = shop; //complete atleast one action, because the customer hasnt visited anystore yet so the first store should always be added
}
while (!visited[i].equals(shop)); //add to the array as long as they're not equal
这是我的输出:
Total coffee orders: 6
Swift, Taylor has visited:
Starbucks
Starbucks
Starbucks
Mars, Bruno has visited:
Second Cup
Second Cup
Ada, Lovelace has visited:
Second Cup
这应该是这样(泰勒两次访问过星巴克,但只能添加一次):
Total coffee orders: 6
Swift, Taylor has visited:
Starbucks
Second Cup
Mars, Bruno has visited:
Starbucks
Second Cup
Ada, Lovelace has visited:
Second Cup
以防万一,这是我的打印方法:
public void displayStoresVisited()
{
for (int i=0; i<size; i++)
System.out.println(visited[i].getName());
}
getName()仅返回我访问过的CoffeeShop数组的索引“ i”处的CoffeeShop的名称
非常感谢您的帮助!这是明天到期! <3
编辑: 我在addStore()方法中更改了“ else”,这要归功于下面的一个可爱的答案,它给了我空指针异常,因为它不知道如何处理她去过的taylors 3rd store(又名星巴克两次),所以我很乐意如果车间相等,则将for循环迭代大小减去1(如下所示)。我认为这不是执行此操作的最佳方法,因此,如果有人从这里开始提供任何技巧来处理此类情况!
非常感谢!
for (int i=0; i<size; i++)
{
if (visited[i] == null)
{
visited[i] = shop;
break;
}
else if (visited[i].equals(shop))
{
size -= 1;
}
else
{
continue;
}
}
这是我将代码更改为有人感兴趣时建议的错误:
Total coffee orders: 6
Swift, Taylor has visited:
Starbucks
Second Cup
Exception in thread "main" java.lang.NullPointerException
at Customer.displayStoresVisited(Customer.java:105)
at TestPhase4.main(TestPhase4.java:82)
答案 0 :(得分:0)
addStore
下方的位置是错误的,因为您没有添加到阵列中,而是将现有商店替换为新商店(然后在以后添加)
else //if none of the positions equal the shop, add it to the array
{
visited[i] = shop;
}
用
替换else {
continue;
}
使用下一个visited
检查i
,甚至最好将其删除,因为它是最后一个
仅当在阵列中添加新店铺时,才增加size
变量
if (visited[i] == null) //if the first position is null (which it will be, add their first shop visited
{
visited[i] = shop;
size++;
break;
}
答案 1 :(得分:0)
int i=0;
while((i<size) && (!visited[i].equals(shop))){
++i;
}
if(i>=visited.length){
//increase the size of your array here.
}
if(i >= size){
visited[i] = shop;
size++;
}
/* get rid of this:
for (int i=0; i<size; i++)
{
if (visited[i] == null)
{
visited[i] = shop;
break;
}
else if (visited[i].equals(shop))
{
size -= 1;
}
else
{
continue;
}
}
*/