繁体   English   中英

如何在不使用预制类的情况下在Java中创建可扩展的动态数组?

[英]How to create extensible dynamic array in Java without using pre-made classes?

是的,这是一个家庭作业问题,所以请给我一个很好的解释! :)

无论如何,这是我需要做的:
我需要一个类,它将在其属性中包含另一个类的对象数组。 在我看来,这样做的正确方法是使用LinkedList,Vector或类似的东西。 不幸的是,上次我这样做的时候,我从教授那里得到了火和硫磺,因为根据他的信念,我使用的是先进的东西,却没有理解基础知识。

现在,下一个明显的解决方案是创建具有固定数量元素的数组,并添加检查以获取和设置,这将查看数组是否已满。 如果它已满,它们将创建新的更大的数组,将旧数组的数据复制到新数组并将新数组返回给调用者。 如果它基本上是空的,它们会创建新的较小数组并将数据从旧数组移动到新数组。 对我来说,这看起来有点愚蠢。 对于我的作业,阵列中可能不会有更多的3个元素,但我想制作一个可扩展的解决方案,而无需手动计算有关阵列填充频率的统计数据,添加的新元素的平均数量是多少,然后使用计算结果计算新数组中的元素数量等。

顺便说一句,没有必要从数组的中间删除元素。

有小费吗?

class test {
    private Object[] objects;
    private int size;

    public test() {
        objects = new Object[10];
        size = 0;
    }

    public void push(Object o) {
        if (objects.length == size) {
            throw new RuntimeException("This wouldn't happen if I didn't have to reinvent the wheel");
        }
        objects[size] = o;
        size++;
    }

    public Object pop() {
        size--;
        Object o = objects[size];
        objects[size] = null;
        return o;
    }
}

开玩笑。 我认为你最好的办法是实现自己的链表,然后在课堂上使用它。 就像是:

class Element {
    Object val;
    Element next;
    Element prev;

    public Element(Object val, Element next, Element prev) {
        this.val = val;
        this.next = next;
        this.prev = prev;
    }

}

class LinkedList {
    Element head;
    Element tail;

    public void add(Object o) {
        Element el = new Element(o, null, tail);
        tail.next = el;
    }

    public Object remove() {
        Element o = tail;
        tail = o.prev;
        tail.next = null;
        return o.val;
    }
}

您需要做的一件事是,当您需要增加数组的大小时,创建一个两倍于旧数组大小的数组。 同样,如果你需要缩小hte数组的大小,只有在数组半满时才这样做。

这将使你必须做更少的阵列副本。

这样做将使得必须保留一个跟踪数组实际大小的变量,因为数组的长度不能准确地表示实际大小。

要将现有阵列复制到更小或更大的阵列,您可能会发现System#arrayCopy()很有用。

开球示例:

Object[] originalArray = new Object[3];
// ...
Object[] resizedArray = new Object[originalArray.length + 2]; // Grow with 2.
System.arrayCopy(originalArray, 0, resizedArray, 0, originalArray.length);

这会将整个originalArray长度的项目复制到resizedArray的开头。 resizedArray末尾的2个插槽仍为null以便您可以将其用于其他项目。

这必须让你开始。 祝好运 :)

它是否适用于数据结构类? 听起来像你的教授希望你实现自己的Linked List数据结构或类似的东西,而不是使用Java提供的。 谷歌和你的教科书是你的朋友。

如果我没记错的话,ArrayList类的工作方式是使用一个固定大小的数组(初始容量为你设置的任何内容),它的调整大小与你描述的方式一样。

您可以使用链接列表,但是您的教授希望您自己编写这些内容,因此请创建自己的课程,以证明您知道它是如何工作的?

我认为它非常简单:p我们不能用C做,但可以用java做

package javaapplication21;

import java.util.Scanner;
public class JavaApplication21 {
    public static void main(String[] args) {
       int a;
       Scanner obj=new Scanner(System.in);
       System.out.print("Enter array size=");
       a=obj.nextInt();
       int b[]=new int[a];
       for(int i=0;i<b.length;i++){
          System.out.println(b[i]+i);
       }
   }
}

暂无
暂无

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

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