繁体   English   中英

Java数组-不确定方法

[英]Java Arrays - unsure about methods

我已经设置了Java任务,这基本上是饭店的模型。 除了最困难的部分外,我基本上已经完成了它。 它基本上是在处理数组和对象。 我不确定其中的几个部分。 我已经完成了使用Array / 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() {

    }
}

我读过你不能做一个不确定长度的数组,但是我不确定如何处理。 如果我将数组初始化为证书号,则很可能会发生错误。 假设我将数组初始化为[10],并且用户添加了20种产品,那将会出错。

第二个问题是addItem函数; 我知道我在这里编写的逻辑存在的问题是,要写入产品的数组的索引只会和数量一样大,因此数量的数组索引就是要写入产品的位置; 不搜索'this.order'并找到NULL数组值,并按数量分配器指定的时间写入乘积。 我不确定该去哪里。

下一个问题是removeItem函数,我想它使用与addItem类似的逻辑。 我在这里没有写任何东西,因为我的尝试是错误的,并且我无法让addItem函数开始工作,所以我离开了。

最后一个问题是toString方法。 toString方法获取定义的整个数组(请说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等之前停止。但是它占用了整个Array,其中有8个是null值; 我不确定如何解决此问题。 数组周围是否有任何东西并定义其长度; 在上面的示例中,我仅添加了2个项目,但我声明了一个长度为[10]的数组; 我怎么知道定义数组的长度? 如果用户在上面的示例中添加了20个启动器,程序将崩溃。

当我使用main方法测试了numberOfItems和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();
    }

}

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

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

一些要点:

  • 您要导入ArrayListArraysIterator但从不使用它们,目的是什么? 您正在使用具有您提到的问题的静态数组。
  • 您应该考虑使用ArrayList在内部存储您的元素,为什么当有一个类适合您时,如果需要的话,为什么还要管理一个必须增长的静态数组呢? (实际上,在您的情况下, LinkedList更好,请看下一点)
  • 通过查看您应该提供给外部的东西,我看到您不需要随机访问,这意味着,如果您确实想滚动自己的收藏集,则应将其建模为链接列表,因为您将没有您提到的问题(例如必须增加数组的大小或管理空值)。

据我了解,您已经使用ArrayListMap实现了相同的功能,现在您需要使用数组来实现它。

最简单的事情是保留一个额外的字段,其中包含有效元素的数量。 不要依赖于找到一个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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM