数组参数传递

时间:2011-10-29 19:12:57

标签: java arrays parameter-passing

我是初学者的java课程。这个实验室对我来说是一个类“钱包”,它操纵代表钱包的数组。电子钱包包含“contents []”数组,用于存储represing paper currency的整数。变量“count”保存钱包中的钞票数量。在编写方法(在serpate Driver类中匹配提供的方法调用)来初始化Wallet并添加货币/更新“count”之后,我需要将一个实例化Wallet的数组传输到另一个。我不知道这是怎么回事,因为一个Wallet类只是弄乱了一个名为“myWallet”的钱包,现在我需要拿一个名为“yourWallet”的新钱包并用“myWallet”的数组值填充它。 //我应该注意,本课程不允许使用Java API库

到目前为止,我的电子钱包课程看起来像这样:

public class Wallet
{
    // max possible # of banknotes in a wallet
    private static final int MAX = 10;

    private int contents[];
    private int count;      // count # of banknotes stored in contents[]

    public Wallet()
    {
        contents = new int[MAX];
        count = 0;
    }

    /** Adds a banknote to the end of a wallet. */
    public void addBanknote(int banknoteType)
    {
        contents[count] = banknoteType;
        count = count + 1;
    }

    /**
     * Transfers the contents of one wallet to the end of another.  Empties the     donor wallet.
     */
    public void transfer(Wallet donor)
    {
        //my code belongs here
    }

...

驱动程序代码如下所示:

public class Driver
{
    public static void main(String args[])
    {
        Wallet myWallet = new Wallet();

        myWallet.addBanknote(5);
        myWallet.addBanknote(50);
        myWallet.addBanknote(10);
        myWallet.addBanknote(5);

        System.out.println("myWallet contains: " + myWallet.toString());

        // transfer all the banknotes from myWallet to yourWallet
        Wallet yourWallet = new Wallet();
        yourWallet.addBanknote(1);
        yourWallet.transfer(myWallet);
        System.out.println("\nnow myWallet contains: "
                                                 + myWallet.toString());
        System.out.println("yourWallet contains: "
                                               + yourWallet.toString());

我想使用addBanknote()来帮助解决这个问题,但我不知道如何告诉transfer()方法将所有myWallet转移到yourWallet中。

我有想法在transfer()中做这样的事情:

yourWallet.addBanknote(myWallet.contents[i]);

通过遍历来增加myWallet内容的i。这看起来非常糟糕,但是我完全不知道写这个方法了。 如果我的问题不明确,没有人能提供帮助,我会非常乐意收到有关如何提出更好的问题或如何使用正确的条款进行搜索的建议。 感谢您提供的任何帮助。

4 个答案:

答案 0 :(得分:1)

我不想破坏你的作业,因为你似乎走的是正确的方式,但我确实有一些你可能会采取或不采取的评论:)

首先,我可能会将银行票据类型放入一些枚举中。但是,这听起来有点进步,请考虑

public class Wallet {
    public static final int ONE_DOLLAR_BILL = 1;
    public static final int FIVE_DOLLAR_BILL = 5;
    ...

    // looks a bit more readable to me
    myWallet.addBanknote(ONE_DOLLAR_BILL);

将捐赠者的所有纸币转移给自己不应该是一个问题 (for循环会这样做)但是如果你试图实现一个

,我认为你处在一个受伤的世界
removeBanknote(int banknoteType);

因为您不仅将count用作长度而且还用作索引变量。我的意思是你假设内容[0] ...内容[count-1]持有有效钞票。如何在没有太多工作的情况下删除一个?

警告:更高级

在您的情况下,我可能会选择使用banknoteType为0来表示钱包中的空钞票插槽,并将_addBanknote(int banknoteType)实现为:

public void addBanknote(int banknoteType) {
    for (int i=0; i < contents.length; i++) {
        if (contents[i] == 0) { 
           contents[i] = banknoteType;
           count++;
           return; // OK inserted banknote at the first empty slot
        }
    }
    throw new RuntimeException("Wallet is full");
} 

此时这可能有点压倒性。但它可以让你实现:

public void removeBanknote(int banknoteType) {
   for (int i=0; i < contents.length; i++) {
       if (contents[i] == banknoteType) {
           contents[i] = 0; // better: NO_BANKNOTE = 0
           count--;
           return;
       }
   }
   throw new RuntimeException("This wallet does not contain a banknote of type " + banknoteType);
}

请注意,在我成功删除或添加钞票时,我会返回这两种方法。只有当我找不到空闲插槽或请求的钞票时,我才完成for循环并最终抛出异常,从而停止程序。

答案 1 :(得分:0)

我认为问题很好,我认为你走的是正确的道路。你打电话Wallet#addBanknote(int)的方式是正确的。你所说的是正确的事:

public void transfer(Wallet donor)
{
    // Traverse the donor's wallet
        // Add the bank note from the donor to this wallet
        // What do you think also needs to happen to make sure
        // the donor is actually giving their bank note?
}

另外一件事,如果你的内容多于Wallet#addBanknote(int),你的MAX方法会发生什么?

答案 2 :(得分:0)

传输方法中的myWallet被命名为“捐赠者”,因此,它看起来并不严重错误:

addBanknote (donor.contents [i]);

你只需要一个环绕它,并删除yourWallet。这是该类的实例的名称。该实例位于类/方法this内,但无需指定,因为范围内没有其他addBanknote - 方法,这可能意味着。 (感谢mangoDrunk)。

答案 3 :(得分:0)

你可以创建一个带另一个钱包的构造函数,或者一个函数(如前所述),并使用System.arraycopy一次性复制数组。 System.arraycopy速度很快,对于像这样的小东西来说肯定有点过分,但它是你的工具包中的好工具。

提到的另一个替代方案是,将一个数组中的元素按循环中的元素复制到另一个元素也可以正常工作。