【问题标题】:How check if array is full and if not full add to it?如何检查数组是否已满,如果未满则添加?
【发布时间】:2020-03-11 00:18:03
【问题描述】:

我有数组。我有一个isFull 方法,它检查数组是否已满,但我不知道如何使用它来检查它是否已满,如果未满则添加到数组中,否则忽略 add 调用。

数组应该有 10 个元素,然后不再接受。在 10 个元素之后,它应该“已满”并忽略任何 addSpy 调用。

你将如何实现它?

public class ConcreteSubject extends AbstractSubject {

    public int arySize;
    private int i = 0;

    private static AbstractSpy[] spies;

    public ConcreteSubject(int a) {
        arySize = a;
        spies = new AbstractSpy[a];
    }

    @Override
    public void addSpy(AbstractSpy spy) {
        if (spies.length < 10) {
            spies[i] = spy;
            System.out.println("spy added at index " + i);
            i++;
        }
    }

    public void isFull() {
        //1
        boolean b = false;

        for (int i = 0; i < spies.length; i++) {
            if (spies[i] == null) {
                b = true;
            }
        }

        if (!b) {
            System.out.println("Array is full");
        } else {
            System.out.println("Array not full");
        }
    }



    public class TestSpies {

        public static void main(String[] args) {

            ConcreteSubject cs = new ConcreteSubject(10);
            AbstractSpy spy = new ConcreteSpy();

            AbstractSpy[] spies = new AbstractSpy[10];

            cs.addSpy(spy);
            cs.addSpy(spy);
            cs.addSpy(spy);

            cs.isFull();

        }
    }

【问题讨论】:

  • 问题不清楚
  • 您可能想更改为public boolean isFull() 以便可以调用if (!cs.isFull()) cs.addSpy(spy);` 如果您尝试在cs.addSpy() 已满时调用它可能会引发异常。另外,建议使用有意义的名称boolean isFull = false;
  • 在 addSpy 定义中,您可以通过与数组的最大大小(上述类中的 arySize)比较而不是与 10 比较来检查数组的大小是否已满。此外,您可以使用静态计数器此类中的变量,可用于在添加时与数组的最大大小(arySize)进行比较。如果该计数器小于或等于最大大小,则可以添加到数组中。每次向数组中添加元素时,都需要向该计数器添加 1。
  • 这是一种需要使用数组的练习吗?我问是因为……你为什么不使用可以按需增长的List&lt;AbstractSpy&gt;
  • 更改 isFull 方法的签名以返回布尔值。在 addSpy 方法的开头调用 isFull 方法。类似:if isFull() return;。还在b = true之后的isFull中添加break

标签: java arrays oop if-statement


【解决方案1】:

使用变量跟踪数组中填充单元格的数量。在向其中插入任何内容之前,请检查填充单元格的计数是否严格小于数组的大小(显然您还想跟踪数组的总大小)。

【讨论】:

    【解决方案2】:

    最简单的方法是这样的:

    @Override
    public void addSpy(AbstractSpy spy) {
      if (!isFull())
      {
        spies[i] = spy;
        System.out.println("spy added at index " + i);
        i++;
      }
    }
    

    要使用它,您应该将 isFull 方法更改为:

    public boolean isFull() {
    
    
      for (int i = 0; i < spies.length; i++) {
         if (spies[i] == null) {
             return false;
         }
      }
    
      return true;
    }
    

    【讨论】:

    • 恐怕这不是一个好的解决方案。想象一下你正在传递nulls,所以它永远不会满,但最终spies[i] 会在你到达i &gt;= spies.length 时抛出一个异常。
    • 是的,你是对的,但无论如何代码存在多个问题。我只是说明了isFull方法的用法
    【解决方案3】:
    1. spies.length &lt; 10 不正确。应该是spies.length &gt; 0 &amp;&amp; i &lt; spies.length 以确保以下分配spies[i] = spy; 始终有效。

    2. void isFull() 应该是boolean isFull()。您的实现看起来不错,只需返回 bfull 是一个棘手的词,因为从技术上讲,数组总是“满的”。更好的形容词是populatedfilled

    3. 1234563

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-28
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      • 2016-01-31
      • 2021-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多