如何在 Java 中编写类似 splice 的方法

How to write a method like splice in Java

我的任务是创建一个与 splice 具有相同功能的方法,但是我无法将适当的值放入适当的索引中。我的代码工作如下,

public void PlaceElementAt(int newValue, int index) throws ArrayIndexOutOfBoundsException {

    //check that index is valid
    if (index >= 0 && index <= data.length) {  //Checks that the index is within position 0 and 7 by default.
        System.out.println ("Index is valid"); //returns index is valid if so
    }
    //increase size if necessary
    if (data.length == numElements) {  //checking if the number of elements is filling the spaces
      doubleCapacity();               // calls upon the double capacity method if it is
    }
    if (numElements==0) {
        data[numElements] = newValue;
        System.out.println ("Element: " + data[numElements] + " at index: " + index);
        numElements++;
    }
    //shuffle values down from index
    else {
     int bottompos = numElements-1;
     int loopcount = numElements-index;
     int NewBottom = numElements+1;
     for (int i=0; i<loopcount; i++){
         data[bottompos]=data[NewBottom];
         bottompos--;
         NewBottom--;
     }
      //insert newValue at index
      data[numElements] = newValue;
        System.out.println ("Element: " + data[numElements] +" at index: " + index);      
        numElements++;

    }
}

当我稍后在我的主要方法中给出命令时,我的问题很明显。

myData.PlaceElementAt(3,0)

myData.PlaceElementAt(2,5)

myData.PlaceElementAt(7,3)

检查断点后,我看到值正在添加到数组中,但是它们是从索引 0 开始逐一添加的。任何建议都非常有帮助。

嗯,看到你的代码,你收到了一个 "index" 参数。但是你没有使用索引来插入你的数组。

您的代码:

data[numElements] = newValue;
numElements++;

试试这个:

data[index] = newValue;
numElements++;

我认为这会解决它,但稍后您将不得不处理指定索引已经有元素的情况。

我正在对您的 class 的结构进行一些假设(根据需要进行调整),但通常我建议向右移动,因为它会简化整个过程。本质上,我们有一个数组,其最大允许大小由 MAX 给出,当前大小由 size 给出。任何时候我们添加到数组,我们都会将 size 的值增加 1(例如插入或添加到列表的后面)。现在,假设我们要在 index 处插入一个 value。这将需要将此索引处和右侧的所有元素向右移动 1,然后将我们的 value 插入到我们创建的 space 中。在进行任何插入之前,我们首先需要检查我们是否有足够的 space 来插入该项目。如果 space 不够用,我们就需要分配额外的 space,禁止插入,或者其他一些替代方案。在您的情况下,您似乎想要分配更多 space.

class MyList
{
  private int MAX = 6;
  private int size = 0;
  private int[] array;

  public MyList()
  {
    array = new int[MAX];
  }

  public void placeElementAt(int value, int index)
  {
    if (size == 0)
    {
      // If size is 0, just insert the value at index 0.
      array[size++] = value;
      return;
    }

    if (index < 0 || index >= size)
    {
      // Index is out of bounds.
      System.out.println("Invalid index.");
      return;
    }

    if (size >= MAX)
    {
      // Max capacity reached -> allocate more space.
      doubleCapacity();
    }

    // Shift all elements at and above index right by 1.
    for (int i = size - 1; i >= index; i--)
    {
      array[i + 1] = array[i];
    }

    // Insert element.
    array[index] = value;
    size++;
  }

  public void doubleCapacity()
  {
    int[] newArray = new int[MAX * 2];

    // Copy old elements to new array.
    for (int i = 0; i < size; i++)
    {
      newArray[i] = array[i];
    }

    // Double MAX to reflect new array.
    MAX *= 2;
    array = newArray;

    System.out.println("Doubled");
  }

  public void add(int value)
  {
    if (size >= MAX)
    {
      // Max capacity reached -> allocate more space.
      doubleCapacity();
    }

    // Add the element to the back of the list.
    array[size++] = value;
  }

  public void print()
  {
    for (int i = 0; i < size; i++)
    {
      System.out.print(array[i] + " ");
    }
    System.out.println();
  }

  public static void main(String[] args)
  {
    MyList data = new MyList();
    data.placeElementAt(1, 0);
    data.print();
    data.placeElementAt(2, 0);
    data.print();
    data.placeElementAt(3, 0);
    data.print();
    data.placeElementAt(5, 0);
    data.print();
    data.placeElementAt(3, 0);
    data.print();
    data.placeElementAt(9, 0);
    data.print();
    data.placeElementAt(4, 0);
    data.print();
    data.placeElementAt(6, 0);
    data.print();
  }
}

这个程序的输出(初始 MAX = 6)将是...

1
2 1
3 2 1
5 3 2 1
3 5 3 2 1
9 3 5 3 2 1
Doubled
4 9 3 5 3 2 1
6 4 9 3 5 3 2 1