2

我已经设置了一个基本上是餐厅模型的 Java 作业。除了最困难的部分,我大部分都完成了。它基本上是处理数组和对象;有几个部分我不确定。我已经完成了实现 ArrayList 和另一个使用 Map/HashMap 的类。

这是我到目前为止所拥有的:

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() {

    }
}

我读过你不能制作一个未定义长度的数组,但我不确定如何处理这个问题;如果我将数组初始化为一个特定的数字,则可能会发生错误。假设我将数组初始化为 [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 个是 null 值;我不确定如何解决这个问题。无论如何在数组周围并定义它的长度;在上面的示例中,我只添加了 2 个项目,但我声明了一个长度为 [10] 的数组;我怎么知道定义数组的长度?如果用户在上面的示例中添加了 20 个启动器,程序将崩溃......

numberOfItems 和 totalCost 函数在我使用 main 方法测试它们时起作用。

任何能指引我正确方向的指导将不胜感激。谢谢,

编辑:我想我有点不清楚;要求是我要基于 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();
    }

}
4

3 回答 3

1

Java 中的数组大小是固定的:在实例化时,必须提供大小。实例化后数组的大小永远不会改变。

您需要的是一种定义动态大小数组的工具。为此,标准 JDK 中存在许多工具。查看List接口及其各种实现(ArrayList等等LinkedList)。

于 2012-12-04T00:28:41.190 回答
0

Some points:

  • you are importing ArrayList, Arrays, Iterator but never use them, what is the purpose? You are just using a static array that have the problems you mentioned.
  • you should consider using an ArrayList to internally store your elements, why would you bother managing a static array that must grow if needed when there is a class that wraps this functionality right for you? (actually a LinkedList is better in your situation, take a look at next point)
  • by looking at what you should provide to the outside I see than you don't need random access, this means that, if you really want to roll your own collection, you should model it as a linked list because you won't have the problems you mentioned (like having to increase size of the array or managing null values).
于 2012-12-04T00:30:25.000 回答
0

据我了解,您已经使用ArrayListand实现了相同的功能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);
}
于 2012-12-04T00:34:58.243 回答