当前位置: 首页 > 知识库问答 >
问题:

为一个类制作一个动态数组,而不使用数组列表在Java中,并且没有被正确地教导如何做

濮翰学
2023-03-14

所以我和一个不擅长教我们做作业需要什么的老师上了Java课。

在这个赋值过程中,我们应该创建一个包含构造函数、方法和必需特性的动态整数数组类。是不允许使用ArrayList的,我已经写了一些ArrayList,一些ArrayList不工作,其他的我不知道怎么做。

以下是要求:

>

  • 私有int数组[]字段。必须在内部将数据存储在一个规则的部分填充整数数组中。请不要使用ArrayList。分配的阵列的大小是其容量,将在下面讨论
  • 私有整数大小字段。此变量存储数组中“已占用”元素的数量。在构造函数中设置为0。

    带参数的构造函数。该参数定义初始数组的容量。分配给定容量的数组,将大小字段设置为零。如果给定给构造函数的参数小于0,将抛出IllegalArgumentException。

    没有参数构造函数。分配大小为10的数组,将大小字段设置为0。

    复制构造函数。构造函数将DynamicArray类型的对象作为参数,并将其复制到它创建的对象中。如果传递给copy from的对象为null,则构造函数将抛出IllegalArgumentException。

    int getSize()返回大小–数组中被占用的元素数。

    int[]toArray()访问器返回数组。确保不返回私有数组字段。相反,为新数组分配内存,将数组字段复制到新对象中,并返回新数组。

    public void push(int num)在数组末尾添加新元素,并增加大小字段。如果阵列已满,则需要增加阵列的容量:a.创建一个新阵列,其大小等于原始阵列容量的两倍。b、 将数组字段中的所有元素复制到新数组中。c、 将新元素添加到新数组的末尾。d、 使用新数组作为数组字段。

    public int pop()抛出RuntimeException删除数组的最后一个元素并返回它。减小大小字段。如果数组为空,则必须抛出带有消息“array is empty”的RuntimeException。此时,请检查阵列的容量。如果容量比占用的元素数(大小)大4倍,则是缩小阵列的时候了:

    a、 创建一个新阵列,其大小等于原始阵列容量的一半。b、 将数组字段中的所有元素复制到新数组中。c、 使用新数组作为数组字段。

    int get(int index)抛出IndexOutOfBoundsException返回具有请求索引的数组元素。如果提供的索引太大或为负,则会抛出IndexOutOfBoundsException,并显示消息“非法索引”。

    int indexOf(int key)返回给定数字的第一个匹配项的索引。当找不到数字时返回-1。

    void add(int index,int num)抛出IndexOutOfBoundsException将新元素(作为参数num传递)添加到index参数指定的数组位置。如果索引大于数组大小或小于0,则引发IndexOutOfBoundsException。将元素添加到数组中间时,必须将所有元素向右移动,以便为新元素腾出空间。如果阵列已满且没有空间容纳新元素,则阵列的大小必须加倍。请按照push()方法描述中列出的步骤将阵列的容量增加一倍。

    int删除(int index)抛出IndexOutOfBoundsExc0019删除此数组中指定位置的元素。当从数组中间移除元素时,所有元素都必须移位以关闭移除元素所产生的间隙。如果传入方法的索引值大于或等于大小或小于0,则必须抛出IndexOutOfBoundsExcION。此时检查数组的容量。如果容量比占用的元素数(大小)大4倍,就该收缩数组了。

    下面是我到目前为止所做的方法。

    /**
     *
     * @author Lisa Hergert
     */
    public class DynamicArray {
        private int array[];
        private int size;
    
        /*
        * Constructor
        * @param capacity - integer
        * throws an IllegalArgumentExeception if capacity is less than 0
        */
        public DynamicArray (int capacity) {
            if (capacity < 0) {
                throw new IllegalArgumentException("Size cannot be less than 0.");
            }
        }
    
        /*
        * no-arg constructor
        */
        public DynamicArray () {
            array = new int [10];
            size = 0;
        }
    
        /*
        * Copies the array to a new one
        * @param - array [] - integer array
        */
        public DynamicArray (int array[]) {
            int arrayCopy [] = new int [array.length];
            for (int i = 0; i < array.length; i++) {
                arrayCopy[i] = array[i];
            }
        }
    
        /*
        * getSize returns the size.
        * @return - size
        */
        public int getSize () {
            return size;
        }
    
        /*
        * @param array[] - integer
        * @return array
        */
        public int [] toArray (int array[]) {
            return array;
        }
    
        /*
        * @param num - integer
        */
        public void push (int num) {
    
        }
    
        /*
        * @return pop - integer
        */
        public int pop() throws RuntimeException { 
            return pop();
        }
    
        /*
        * @param index - integer
        */
        public int get(int index) throws IndexOutOfBoundsException {
            if (index >= size || index < 0)
                throw new IndexOutOfBoundsException("Illegal Index");
            return array[index];
        }
    
        public int indexOf(int key) {
            int index = 0;
    
            return index;
        }
    
        public void add(int index, int num) throws IndexOutOfBoundsException {
            if (index >= size || index < 0)
                throw new IndexOutOfBoundsException("Illegal Index");
            int oldValue = array[index];
            array[index] = num;
            return oldValue;
        }
    
        public int remove(int index) throws IndexOutOfBoundsException {
    
        }
    }
    

    我在寻求帮助,甚至是建议,告诉我在哪里可以找到我需要做的事情。我要去学校的辅导实验室,看看他们是否能帮助我理解老师没有教好的东西,但是在那之前,我想试着自己做一点工作。

    这里是几个问题之一。

    /*
    * @return pop - integer
    */
    public int pop() throws RuntimeException { 
        return pop();
    }
    

    我知道这是不对的。即使你不想给我看代码,你能不能给我推荐一个网站,我可以查一下我需要做什么,这个网站的要求是#9。

    谢谢你的帮助。我希望我能在没有帮助的情况下做到这一点,但事实并非如此,所以我不得不使用外部资源。这个网站在过去非常有用。

  • 共有3个答案

    刘向阳
    2023-03-14

    public int pop()抛出RuntimeException删除数组的最后一个元素并返回它。减小大小字段。如果数组为空,则必须抛出带有消息“array is empty”的RuntimeException。此时,请检查阵列的容量。如果容量比占用的元素数(大小)大4倍,则是缩小阵列的时候了:

    a、 创建一个新阵列,其大小等于原始阵列容量的一半。b、 将数组字段中的所有元素复制到新数组中。c、 使用新数组作为数组字段。

    目前,您的pop命令正在递归地自行运行。这会崩溃。

    编辑:我建议在pop之前部分执行remove,因为这会使pop更容易。

    让我们把它分解成一个要点列表,并检查每个项目。(此外,我建议针对你需要的每一条建议提出一个新问题)

    1. 公共int pop()抛出运行时异常
    2. 删除数组的最后一个元素并返回它。
    3. 递减大小字段。
    4. 如果数组是空的,则必须抛出带有数组是空消息的RuntimeExcure。
    5. 此时检查数组的容量。如果容量大于占用元素数量(大小)的4倍,则是收缩数组的时候了:
    6. a.创建一个新的数组,其大小等于原数组容量的一半。将数组字段中的所有元素复制到新数组中。使用新数组作为数组字段。

    现在我把它分解成几个部分,首先我会忽略3,4,5,6

    只需实现一个超级愚蠢的pop方法,从数组中删除最后一个元素。

    一旦你有工作,集中精力在边缘案件。

    3。减小大小字段这将是整个课堂的一个交叉问题。您只希望在代码中一小部分可重用的部分中执行此操作,因为每次添加或删除元素时,都会弄乱大小字段。

    4。如果数组为空,则必须抛出带有消息“array is empty”的RuntimeException 在pop方法的一开始,您就需要解决这个问题,因为它是一个保护无效使用的保护条款。

    <代码>5.此时检查数组的容量。如果容量比占用元素的数量(大小)大4倍,那么是时候缩小数组了:同样,这可能是一个反复出现的交叉问题,所以将其定义为一个被重用的单独的私有方法将要乐于助人。

    6。a、 创建一个新阵列,其大小等于原始阵列容量的一半。b、 将数组字段中的所有元素复制到新数组中。c、 使用新数组作为数组字段提供了如何最好地实现5的指导。

    您可以在数组静态帮助类的文档中找到有关数组复制和填充的更多信息。https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html以及Systemhttps://docs.oracle.com/javase/8/docs/api/java/lang/System.html#arraycopy(java.lang.Object, int,<--plhd--3/中的arrayCopy方法>对象,int,int)

    益炜
    2023-03-14

    让我们重新开始。从一开始。我将在本教程中评论每一步。(请注意,这个问题通常过于宽泛,无法回答,但今天我还是要这样做。)

    在这个赋值过程中,我们应该创建一个包含构造函数、方法和必需特性的动态整数数组类。

    让我们从课程本身开始:

    public final class DynamicArray {
    }
    

    这是你已经完成的部分。接下来的所有内容(字段、方法)都将成为该类的一部分。有一点需要注意:我将该类设置为final,以防止子类化,否则会导致其他一些问题。

    私有int数组[]字段。必须在内部将数据存储在一个规则的部分填充整数数组中。请不要使用ArrayList。分配的阵列的大小是其容量,将在下面讨论。

    你也已经这样做了:

    private int[] array;
    

    请注意,我通常会将该字段标记为private。但是,由于其他一些需求过于庞大,我们无法做到这一点。

    私有整数大小字段。此变量存储数组中“已占用”元素的数量。在构造函数中设置为0。

    你也已经这样做了:

    private int size;
    

    “在构造函数中设置为0”的要求是多余的,因为在Java中,这些字段被初始化为默认值(在本例中为0)。这意味着,每当您创建DynamicArray类的实例时,size字段的值将自动为0。因此,我不会在以下构造函数中设置大小。

    带参数的构造函数。该参数定义初始数组的容量。分配给定容量的数组,将大小字段设置为零。如果给定给构造函数的参数小于0,将抛出IllegalArgumentException。

    虽然您已经向我们展示了构造函数,但您忘记了初始化数组。我们开始吧:

    public DynamicArray(int capacity) {
        if (capacity < 0)
            throw new IllegalArgumentException("Capacity cannot be less than 0.");
        array = new int[capacity];
    }
    

    我认为,即使容量为0也没有多大意义,但我们可以在以后处理(当阵列增长时)。

    没有参数构造函数。分配大小为10的数组,将大小字段设置为0。

    您已经展示了构造函数,但是应该使用构造函数链接,因为您已经有了另一个处理初始化的构造函数。

    public DynamicArray() {
        this(10);
    }
    

    最好有一个常数:

    private static final int DEFAULT_CAPACITY = 10;
    
    public DynamicArray() {
        this(DEFAULT_CAPACITY);
    }
    

    复制构造函数。构造函数将DynamicArray类型的对象作为参数,并将其复制到它创建的对象中。如果传递给copy from的对象为null,则构造函数将抛出IllegalArgumentException。

    不幸的是,你搞错了。复制构造函数接受另一个DynamicArray(不是int[])。

    public DynamicArray(DynamicArray source) {
        if (source == null)
            throw new IllegalArgumentException("Source array must not be null.");
        this.array = Arrays.copyOf(source.array, source.array.length);
        this.size = source.size;
    }
    

    这将使用帮助类java.util.数组来创建内部数组的副本。

    int getSize()返回大小–数组中被占用的元素数。

    好的。这个很简单:

    public int getSize() {
        return size;
    }
    

    int[]toArray()访问器返回数组。确保不返回私有数组字段。相反,为新数组分配内存,将数组字段复制到新对象中,并返回新数组。

    虽然有这种方法,但忘记了制作内部数组的副本。你不能退回那个。您不应该返回该值,因为任何调用方都可以更改您的内部数组。因此,我们将使用与复制构造函数相同的技术:

    public int[] toArray() {
        return Arrays.copyOf(array, array.length);
    }
    

    public void push(int num)在数组末尾添加新元素,并增加大小字段。如果阵列已满,则需要增加阵列的容量。

    这种方法大有可为。因此,您应该使用一些帮助器方法,例如用于不断增长的功能。

    public void push(int num) {
        growIfNecessary();
        array[size] = num;
        size += 1;
    }
    

    一些解释:我现在推迟了不断增长的功能(所以我将其提取到稍后将展示的另一个方法中)。为了将给定的数字推入内部数组,您必须知道确切的位置。幸运的是,size字段准确地告诉您这一点,但您还必须增加该指针。你也可以这样做:

    public void push(int num) {
        growIfNecessary();
        array[size++] = num;
    }
    

    public int pop()抛出RuntimeException删除数组的最后一个元素并返回它。减小大小字段。如果数组为空,则必须抛出带有消息“array is empty”的RuntimeException。此时,请检查阵列的容量。如果容量比占用的元素数(大小)大4倍,则是缩小阵列的时候了。

    public int pop() {
        if (size == 0)
            throw new NoSuchElementException();
        int result = array[--size];
        shrinkIfNecessary();
        return result;
    }
    

    提示:我抛出了另一个更适合这种情况的例外。弹出一个元素是推动一个元素的相反功能。我们首先递减指针,然后读取并返回值。此外,我将收缩功能提取到另一种方法中,稍后也将展示这种方法。

    int get(int index)抛出IndexOutOfBoundsException返回具有请求索引的数组元素。如果提供的索引太大或为负,则会抛出IndexOutOfBoundsException,并显示消息“非法索引”。

    你完全正确:

    public int get(int index) throws IndexOutOfBoundsException {
        if (index >= size || index < 0)
            throw new IndexOutOfBoundsException("Illegal index");
        return array[index];
    }
    

    int indexOf(int key)返回给定数字的第一个匹配项的索引。当找不到数字时返回-1。

    使用此方法,您将在数组中搜索给定的数字。它需要一个循环!

    public int indexOf(int key) {
        for (int i = 0; i < size; i++)
            if (array[i] == key)
                return i; // found
        return -1; // not found
    }
    

    void add(int index,int num)抛出IndexOutOfBoundsException将新元素(作为参数num传递)添加到index参数指定的数组位置。如果索引大于数组大小或小于0,则引发IndexOutOfBoundsException。将元素添加到数组中间时,必须将所有元素向右移动,以便为新元素腾出空间。如果阵列已满且没有空间容纳新元素,则阵列的大小必须加倍。请按照push()方法描述中列出的步骤将阵列的容量增加一倍。

    这一个有点先进,因为它需要改变元素,而你在尝试中没有这样做。那我们走吧:

    public void add(int index, int num) throws IndexOutOfBoundsException {
        if (index > size || index < 0)
            throw new IndexOutOfBoundsException("Illegal index");
        growIfNecessary();
        System.arraycopy(array, index, array, index + 1, size - index);
        array[index] = num;
        size += 1;
    }
    

    说明:索引检查现在必须检查索引是否大于大小(不大于或等于),因为您还可以在数组末尾添加元素(在size指向的位置)。然后,如果需要,我们必须增加阵列(如push方法)。然后,我使用一个Java内置类将所有元素从给定的索引位置移到右端。最后一步是在给定索引处添加元素,我们不能忘记增加大小。

    int删除(int index)抛出IndexOutOfBoundsExc0019删除此数组中指定位置的元素。当从数组中间移除元素时,所有元素都必须移位以关闭移除元素所产生的间隙。如果传入方法的索引值大于或等于大小或小于0,则必须抛出IndexOutOfBoundsExcION。此时检查数组的容量。如果容量比占用的元素数(大小)大4倍,就该收缩数组了。

    这是最难的方法。我将直接向您展示整个过程:

    public int remove(int index) {
        if (index >= size || index < 0)
            throw new IndexOutOfBoundsException("Illegal Index");
        int result = array[index];
        System.arraycopy(array, index + 1, array, index, size - index - 1);
        size -= 1;
        shrinkIfNecessary();
        return result;
    }
    

    我们首先要检查索引,然后才能得到该方法稍后将返回的元素。现在轮换了:我们将所有元素从位置索引1移到末尾,向左移一个位置。然后减小大小,必要时缩小内部阵列。就这样。

    现在我将向您展示最后两种助手方法。

    让我们从成长的方法开始:

    A.创建一个新数组,其大小等于原数组容量的两倍。将数组字段中的所有元素复制到新数组中。将新元素添加到新数组的末尾。使用新数组作为数组字段。

    private void growIfNecessary() {
        if (size == array.length) {
            if (array.length == 0)
                array = new int[1]; // Special case for capacity 0.
            else
                array = Arrays.copyOfRange(array, 0, array.length * 2);
        }
    }
    

    如果大小等于容量,则阵列已满。同样,我使用的是Arrayshelper类。copyOfRange方法能够创建更大的数组。

    现在谈谈收缩法:

    a、 创建一个新阵列,其大小等于原始阵列容量的一半。b、 将数组字段中的所有元素复制到新数组中。c、 使用新数组作为数组字段。

    private void shrinkIfNecessary() {
        if (size * 4 <= array.length)
            array = Arrays.copyOfRange(array, 0, array.length / 2);
    }
    

    在这里,我们没有任何特殊情况。如果容量比大小大4倍,只需缩小阵列即可。就这样。

    仔细研究代码并尝试重现代码。使用库方法(System.arraycopyArrays.copyOf)可以很容易地被使用临时数组的简单for循环所取代。试试看。

    长孙承嗣
    2023-03-14

    这是一个很好的编程作业,可以让学生清楚地了解ArrayList。正如你可能已经猜到的那样,你的老师希望你实现你自己的ArrayList,这是教授数据结构的一个很好的方法。

    从一个接一个的需求开始

    >

    公共交通(国际通行能力){if(通行能力)

    没有参数的构造函数:与以前相似,只是容量将被替换为常量值10。为了清晰起见,你把这个常数赋值为

    公共静态最终int默认容量=10;

    • 在推或弹出时收缩/增加容量,这样想,如果你知道你的饼干罐很快就会耗尽空间,你会怎么做。你会得到一个新罐子。现在,你如何决定你想要多大的罐子?如果你想变大,答案是双倍,如果你想变小,答案是1/4。获取一个新的jar类似于创建一个新的整数数组对象。然后你把所有的饼干从小罐子移到大罐子里,丢弃罐子。同样,将旧数组中的每个项复制到新数组中。

    这个答案可能相当长,我知道如果我将源代码传递给你,那将是欺骗,但据我所知,你真的很愿意看到它是如何完成的,因此你可以查看ArrayList的参考实现:http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/tip/src/share/classes/java/util/ArrayList.java

    这一点最初可能会让人感到害怕,但如果仔细研究grow()方法、ensurecapity()方法、indexOf()方法、clone()方法、add()方法,就会更好地了解它在java中的实现方式

     类似资料:
    • 我试图确定数组列表中的数字是否可以被antoher数组列表中的所有数字整除。我下面的代码输出列表中的所有数字,这些数字可以被中的任何除数整除。我想输出列表中所有除数都可以整除的值,而不是它们中的任何一个。例如,如果我有listdiv=[1,2,3,,5,8]和listdivisor=[2,4]。预期的输出应该是8,但此代码输出2和8。 非常感谢。我们将非常感谢您的努力!

    • 问题内容: 由于数组中的equals函数仅检查实例,因此它不适用于Set。因此,我想知道如何在Java中制作一组数组? 一种可能的方法是将每个数组放在一个对象中,并为该类实现equals函数,但这会降低性能吗? 问题答案: 由于ArrayList类已经包装了一个数组,因此您可以扩展它并覆盖and 方法。这是一个示例: 更新: 您甚至可以重写它以用于一般用途,只需将代码更改为:

    • 我用python制作了这个数组,但我不记得用java怎么做:

    • 问题内容: 我见过类似的问题,但没有一个提供我所要的答案,因此,如果这被认为是重复的,我在此致歉。我正在尝试将数组{1,2,3}和{4,5,6}合并为{1,2,3,4,5,6}。我做错了什么?我是java的新手。抱歉,问题很愚蠢。 问题答案: 代替 您需要调用merge方法,并将结果分配给数组,例如: 您的for循环也应该是:

    • 问题内容: 例如,如果我有一个元组列表 如何解开元组并将其重新格式化为一个列表 我认为这也与功能有关,但是我真的不知道该怎么做。请赐教。 问题答案: b = [i for sub in a for i in sub] 这样就可以了。

    • 问题内容: 我想要创建一个arraylist数组,如下所示: 但是它没有编译。我怎样才能做到这一点? 问题答案: 根据Oracle文档: “你不能创建参数化类型的数组” 相反,你可以执行以下操作: 正如汤姆·霍廷(Tom Hawting)的建议-定位线一样,最好这样做: