【问题标题】:Array parameter passing数组参数传递
【发布时间】:2011-10-29 19:12:57
【问题描述】:

我正在上初学者的 Java 课程。这个实验室是让我创建一个类“钱包”来操作代表钱包的数组。钱包包含“contents[]”数组来存储代表纸币的整数。变量“count”保存钱包中纸币的数量。在编写方法(匹配在单独的驱动程序类中提供的方法调用)以初始化钱包并添加货币/更新“计数”之后,我需要将一个实例化钱包的数组转移到另一个。我不知道这将如何工作,因为一个 Wallet 类只与一个名为“myWallet”的钱包打交道,现在我需要一个名为“yourWallet”的新钱包并用“myWallet”的数组值填充它。 //需要注意的是,本课程不允许使用Java API库

到目前为止,我的 Wallet 类看起来像这样:

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。这似乎是可怕的错误,但我完全不知道编写这种方法。 如果我的问题不清楚以至于没有人可以提供帮助,我将非常乐意收到有关如何提出更好的问题或如何使用正确的术语进行搜索的建议。 感谢您提供的任何帮助。

【问题讨论】:

    标签: java arrays parameter-passing


    【解决方案1】:

    我不想破坏你的作业,因为你似乎走对了路,但我确实有一些你可以带或不带的 cmets :)

    首先,我可能会列举一些钞票类型。但这听起来有点高级,请考虑

    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 作为长度,而且还作为索引变量。我的意思是你假设 contents[0] ... contents[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 循环并最终抛出异常,从而停止程序。

    【讨论】:

      【解决方案2】:

      我认为这个问题很好,我认为你走在正确的道路上。您拨打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?
      }
      

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

      【讨论】:

      • 我认为transfer(钱包捐赠者)的意思是“将捐赠者的所有钞票转给我”。 transfer(Wallerdonor, int bankNoteType) 表示“将 1 张给定类型的单张纸币从捐赠者转移给我”。我个人会选择 transferTo(Waller receiver) 因为在 api 中给钱感觉比接受它更自然:)
      • @extraneon 我认为这些是 OP 的好问题和担忧。我假设(可能是错误的)他们得到了某种模板并且必须填写它。我不明白你对bankNoteType 的看法,因为钞票只是钞票的价值(除非我'我错了)。所以内容就像:[1, 5, 20, 20, 100].
      • @mangoDrunk 你写的最后一行中的“#”有什么作用?您对缺少方法的模板 Wallet 以及所讨论的数组只是 int 值都是正确的。另外,externeon 感谢您解释方法调用!这是(现在仍然是)我的问题中最不清楚的部分之一。那叫什么?方法参数还是有更好的名字?
      • @DiscipleApollos 抱歉,无论您在哪里看到 #,请将 # 替换为 .。这只是一种记录事物的方式(它不是正确的语法)。方法参数是对的。
      【解决方案3】:

      您可以创建一个带有另一个钱包的构造函数,也可以创建一个函数(如前所述)并使用 System.arraycopy 一举复制数组。 System.arraycopy 速度很快,对于像这样的小东西来说绝对是矫枉过正,但它是您工具包中的好工具。

      提到的另一种选择,在循环中逐个元素地将元素从一个数组复制到另一个元素也可以。

      【讨论】:

      • 在这种情况下,我认为我不允许使用预制方法。我正在写下 System.arraycopy 以备后用。感谢您的帮助!
      【解决方案4】:

      transfer 方法中的 myWallet 被命名为“donor”,这样看起来并没有大错:

      addBanknote (donor.contents [i]);
      

      您只需要围绕它进行一个循环,然后删除 yourWallet。这是该类的实例的名称。该实例在类/方法this 内,但不需要指定,因为范围内没有其他addBanknote-Method,这可能意味着。 (感谢 mangoDrunk)。

      【讨论】:

      • yourWallet 也应该是 this 或被删除。
      猜你喜欢
      • 2018-07-26
      • 2022-08-03
      • 2013-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      • 2023-03-24
      相关资源
      最近更新 更多