方法,该方法在java中的数组中的任意点插入对象

方法,该方法在java中的数组中的任意点插入对象,java,arrays,object,Java,Arrays,Object,在不使用任何数组列表或向量或数组以外的任何其他内置java数据结构的情况下,我需要编写一个方法,在任何位置插入动物对象,并将当前位置和其他位置的对象向右移动 在执行此操作时,我必须确保集合尚未达到其最大值 我该如何写出这个方法呢?我的版本不会编译到错误。我想不出这个问题。有人能帮我用我当前的代码编写这个方法并提供解释吗 private Animal [] objects; final int MAX_ANIMALS = 100; public AnimalObject() { obj

在不使用任何数组列表或向量或数组以外的任何其他内置java数据结构的情况下,我需要编写一个方法,在任何位置插入动物对象,并将当前位置和其他位置的对象向右移动

在执行此操作时,我必须确保集合尚未达到其最大值

我该如何写出这个方法呢?我的版本不会编译到错误。我想不出这个问题。有人能帮我用我当前的代码编写这个方法并提供解释吗

private  Animal [] objects;
final int MAX_ANIMALS = 100;

public AnimalObject()
{
    objects = new AnimalObject[MAX_ANIMALS];
}

public AnimalObject(Animal[]a)
{
    objects = a;    
}


public void addAnimal(Animal a,int position)
{ 
    Animal [] newAnimal = new Animal[objects.length];
    for(int i =0; i < position; i++)
    {
        newAnimal[i] = objects[i];
    }
    newAnimal[position] = a;
    System.arraycopy(objects, position, newAnimal, position+1, objects.length - position);

    for(int i = position+1; i < newData.length; i++)
    {           
        newAnimal[i] = objects[i-1];    
    }
私人动物[]物品;
最终int最大值=100;
公共动物对象()
{
对象=新的AnimalObject[MAX_ANIMALS];
}
公共动物对象(动物[]a)
{
对象=a;
}
公共动物(动物a,内部位置)
{ 
Animal[]newAnimal=新动物[objects.length];
对于(int i=0;i
我不会试图修复您不完整的代码,但我会提供一个可能的解决方案和一条建议。让我们从建议开始:不要重新发明轮子。除非您将此作为练习,否则请使用
数组列表。
正是为了这样做。如果这是一个练习,我不确定您是否会从中获益匪浅正在查找有关StackOverflow的答案。最好检查
ArrayList
源代码:)

至于一个可能的解决方案,这里有一个-我试图模仿您上面粘贴的内容(为了可读性,对命名做了一些小的调整):

公共类动物数组{
最终int最大值=100;
私人动物[]动物;
公共动物数组()
{
this.animes=新动物[最大动物];
}
公共动物数组(动物[]a)
{
这是动物=a;
}
公共动物(动物,内部位置){
动物[]新动物=新动物[animals.length+1];
对于(int i=0;i
显然,您需要添加更多的方法(如检索数组的元素)。但是请记住,上面的代码效率很低。每次添加元素时,数组都会增长

当您想正确执行此操作时,您应该:

  • 使数组的初始大小大于所需大小(空构造函数确实会创建一个最大容量的数组,但“固定”版本的代码不会忽略该值,并在每次添加元素时分配一个新数组)
  • 当数组增长时(即,您添加了一个元素,但数组不够大,无法添加新的元素),您应该计算它应该增长多少-应该为此设计一个算法。当数组增长时,您可以使用Arrays.copyOf方法分配更大的数组

  • 通过检查ArrayList,您可以获得更多关于如何完成任务的想法。除了更高效之外,它也是通用的,这不能说是关于您的代码的(这可以修复,但再次使用ArrayList!)。

    您的编译器错误是什么?请将其添加到您的问题中。如果由于[N.B.]原因无法编译,请注意]对于错误,错误是什么?我重新格式化了您的代码以对齐所有内容,除非您遗漏了一些内容,否则它没有任何意义,这可能就是它没有编译的原因。其中一个原因是,您的第一个构造函数正在调用自身,然后声明一个自身数组,这两个都是您无法做到的。我想您可能需要做一些研究关于如何编写您自己的类以及如何声明和初始化数组。请至少发布一个完整的类代码。在发布的示例中,“addAnimal”方法没有被阻塞。“newData”变量是什么?它没有在代码中声明示例中没有经过您的代码,但可能很有用,请查看它
    public class AnimalsArray {
    
        final int MAX_ANIMALS = 100;
        private Animal[] animals;
    
        public AnimalsArray()
        {
            this.animals = new Animal[MAX_ANIMALS];
        }
    
        public AnimalsArray(Animal[]a)
        {
            this.animals = a;
        }
    
        public void addAnimal(Animal animal, int position) {
            Animal[] newAnimals = new Animal[animals.length + 1];
            for (int i = 0; i < position; i++) {
                newAnimals[i] = animals[i];
            }
            newAnimals[position] = animal;
            System.arraycopy(animals, position, newAnimals, position + 1, animals.length - position);
            this.animals = newAnimals;
        }
    }