我已经设置了一个Java任务,它基本上是一个餐馆的模型。除了最困难的部分,我大部分完成了它。它基本上处理数组和对象;有几个部分我不确定。我已经完成了使用Map / HashMap实现ArrayList和另一个的类。
这是我到目前为止所做的:
package restaurant;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class ArrayOrder implements Order {
Product order[];
public ArrayOrder() {
this.order = new Product[1000];
}
public Iterator<Product> iterator() {
}
public void addItem(Product product, int quantity) {
/*for(int i = 0; i < quantity; i++)
{
this.order[i] = product; // WRONG CODE
}*/
}
public void removeItem(Product product) {
}
public int numberOfItems() {
int length = 0;
for(int i = 0; i < this.order.length; i++){
if(this.order[i] != null) {
length++;
}
}
return length;
}
public int totalCost() {
int resultcost = 0;
for(int i = 0; i < this.order.length; i++) {
if(this.order[i] != null) {
resultcost += this.order[i].getCost();
}
}
return resultcost;
}
public String toString() {
return Arrays.toString(this.order);
}
public int hashCode() {
}
public boolean equals() {
}
}
我已经读过你不能制作一个未定义长度的数组,但我不确定如何处理这个;如果我将数组初始化为certian数字,则可能会发生错误。假如我将数组初始化为[10]并且用户添加了20个产品,则会出错。
第二个问题是addItem函数;我知道我在这里写的逻辑的问题是产品被写入的数组的索引只有数量那么大所以数量的数组索引是产品被写入的地方;不搜索'this.order'并找到一个NULL数组值并按照数量对手指定的次数写出产品。我不知道到底该怎么做。
下一个问题是removeItem函数,我想这个函数使用与addItem类似的逻辑。我没有在这里写任何东西,因为我的尝试是错误的,我无法让addItem函数起作用,所以我离开了。
最后一个问题是toString方法。 toString方法获取定义的整个数组(SAY this.order = new Product [10]),我真的不想这样做。
例如:
//int id, String name, String description, int cost, int serves
Starter s = new Starter(25, "Salad", "A traditional English salad", 750, 1);
Order o3 = new ArrayOrder();
o3.addItem(s, 2);
toString
方法产生:
[Salad - A traditional English salad (serves 1) $7.50, Salad - A traditional English salad (serves 1) $7.50, null, null, null, null, null, null, null, null]
我希望它在null,null,null等之前停止。但它接受整个数组,其中8个是空值;我不确定如何解决这个问题。无论如何围绕阵列并确定其长度;在我上面的例子中,我只添加了两个项目,但我声明了一个长度为数组的数组[10];我怎么知道定义数组的长度?如果用户在上面的示例中添加了20个启动器,程序将崩溃...
numberOfItems&amp;使用main方法测试它们时,totalCost函数可以正常工作。
任何指导我指向正确方向的指导都将不胜感激。 谢谢,
编辑: 我想我有点不清楚;要求是我要基于UML图创建几个类。在这里,我必须创建3个类,所有类都实现Order接口。这三个类是(ListOrder,ArrayOrder,MapOrder)。我已经完成了MapOrder和ListOrder,但我被困在ArrayOrder上。
这是我的ArrayList类:
package restaurant;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ListOrder implements Order{
private List<Product> order;
public ListOrder() {
this.order = new ArrayList<Product>();
}
public Iterator<Product> iterator() {
return order.iterator();
}
public void addItem(Product product, int quantity) {
for(int i = 0; i < quantity; i++) {
this.order.add(product);
}
}
public void removeItem(Product product) {
this.order.remove(product);
}
public int numberOfItems() {
return this.order.size();
}
public int totalCost() {
int resultcost = 0;
for(Product p : order)
{
resultcost += p.getCost();
}
return resultcost;
}
public String toString() {
return this.order.toString();
}
}
答案 0 :(得分:1)
Java中的数组大小是固定的:实例化时,必须提供大小。实例化后,数组的大小永远不会改变。
您需要的是定义动态大小数组的工具。为此,标准JDK中存在许多工具。查看List
界面及其各种实现(ArrayList
,LinkedList
等等。
答案 1 :(得分:0)
有些观点:
ArrayList
,Arrays
,Iterator
但从不使用它们,目的是什么?您只是使用了一个存在上述问题的静态数组。ArrayList
在内部存储您的元素,为什么还要管理一个必须增长的静态数组,如果有一个包含此功能的类适合您? (实际上LinkedList
在你的情况下更好,看看下一点)答案 2 :(得分:0)
据我了解,您使用ArrayList
和Map
实现了相同的功能,现在您需要使用数组实现它。
最简单的方法是使用有效元素的数量保留一个额外的字段。不要依赖于找到null
元素,因为这样做效率低且容易出错(特别是如果要求突然改变并且您需要允许null
元素)。
您还需要int quantities[]
字段来维护数量。这两个数组应始终大小相同。
然后,当您必须添加新元素时,可以将有效元素的数量与order.length
(当前分配的“容量”)进行比较。如果添加新元素会超出容量,那么您只需重新分配order
:
public void addItem(Product product, int quantity) {
if (currentSize >= order.length) {
Product[] temp = new Product[order.length + GROWTH_FACTOR];
System.arraycopy(order, 0, temp, 0, currentSize);
order = temp;
int[] q2 = new int[order.length + GROWTH_FACTOR];
System.arraycopy(quantities, 0, q2, 0, currentSize);
quantities = q2;
}
quantities[currentSize] = quantity;
order[currentSize++] = product;
}
此处GROWTH_FACTOR
是一个常数,表示当你用完房间时扩展阵列的数量。
或者,您可以引入一个保留产品/数量对的私有静态类:
private static class OrderItem {
final Product product;
final int quantity;
OrderItem(Product product, int quantity) {
this.product = product;
this.quantity = quantity;
}
}
private OrderItem[] orders;
private int currentSize;
public void addItem(Product product, int quantity) {
if (currentSize >= orders.length) {
// reallocate orders array
}
orders[currentSize++] = new OrderItem(product, quantity);
}