删除数组元素 - 将所有元素下移一个索引

5
我有一段代码,允许用户从他们选择的数组中删除一个元素,但是我希望将所有现有元素“下移一个”,以便在数组中不留下空隙。
目前,如果我删除第一个元素(索引0),它会被删除,但如果我向数组添加信息,则该信息会输入到索引1,而索引0则为空。如果从具有以下索引中的信息的索引中删除了某些内容,如何将所有信息下移一个索引?
我的删除方法:
  static void deleteStudent() {
    System.out.println("Wish student would you like to delete?");
    for(int i=0;i<9;i++) {
      System.out.println(i + ": " + studentNamesArray[i]);
    }
    int studentChoice = input.nextInt();
    for(int i = studentChoice+1; i<studentNamesArray.length; i++) {
      studentNamesArray[i-1] = studentNamesArray[i];
    }
  }

编辑:

我在数组中添加了四个条目: [one, two, three, four, null, null, null, null, null, null]

我运行程序并尝试删除索引[2],这是成功的,并输出以下内容: [one, two, four, null, null, null, null, null, null, null]

正如你所看到的,元素已按照预期向下移动,问题是当我再次向数组添加一个值时,被删除的索引被跳过,该元素被输入到下一个索引中,如下所示: [one, two, four, null, newadd, null, null, null, null, null]

如何使程序将新值输入到正确的数组中?

添加方法:

  static void addStudent() {
    if (nameArrayCount < 10) {
      System.out.println("Enter the student's name in the following format - surname, forename: ");
      studentName = input.next();
      studentNamesArray[nameArrayCount] = studentName;
      nameArrayCount = nameArrayCount + 1;
    }
    else if (nameArrayCount == 10) {
      System.out.println("******Array is full, please delete a student before adding another.*****");
    }
    if (markArrayCount < 10){
    System.out.println("Enter the first mark: ");
          markOne = input.nextInt();
          System.out.println("Enter the second mark: ");
          markTwo = input.nextInt();
          System.out.println("Enter the third mark: ");
          markThree = input.nextInt();
          studentMarksArray[markArrayCount][0] = markOne;
          studentMarksArray[markArrayCount][1] = markTwo;
          studentMarksArray[markArrayCount][2] = markThree;
          markArrayCount = markArrayCount + 1;
    }
  }

你可以使用 ArrayList。 - Developer Marius Žilėnas
很遗憾,出于这个目的,我不能使用ArrayList或数组导入。 - Colin747
2
https://dev59.com/AnnZa4cB1Zd3GeqPsqae - Kai Döhler
发布已编辑,附带新信息。 - Colin747
4个回答

2

我重写了你的代码,但是添加了一个临时数组,该数组存储除第一个索引位置以外的所有值,而不包括删除的元素。这样可以删除该元素并将数组向左移动到最左边的位置,而右侧最后一个位置保留为空。

static void deleteStudent() {
    System.out.println("Which student would you like to delete?"); //fixed spelling error
    for(int i=0;i<9;i++) {
      System.out.println(i + ": " + studentNamesArray[i]);
    }
    int studentChoice = input.nextInt();
    StudentName[] temp = new StudentName[studentNamesArray.length];//I don't know format
    for(int i = 0; i<studentNamesArray.length; i++) {
        if(i != studentChoice)
        {
            temp[j] = studentNamesArray[i]
            j++;
        }
    }
    temp[studentNamesArray.length-1] = null;
    studentNamesArray = temp;
}

我刚刚编辑了我的原始帖子,因为你添加了这个,这会解决我的更新问题吗? - Colin747
不,我最初没有在您的删除方法中发现问题,只是提供了一个我知道可以工作的替代解决方案。让我花点时间查看添加方法,如果我找到问题,我会进行编辑。 - SpiderShlong
谢谢,我认为这可能与nameArrayCount有关,因为每次添加一个元素时,我都会加1,所以如果我添加4个元素,计数器就是3,但是如果我删除[1],计数器仍然是3,所以当我添加新的学生时,计数器就变成了4。 - Colin747
我正要发布那个:)。另外,除非你将0视为一个学生,否则应该这样做:“studentNamesArray[nameArrayCount-1] = studentName;”,否则你可能会超出最大名称计数的范围。 - SpiderShlong
没事的,很高兴能帮上忙。 - SpiderShlong
显示剩余2条评论

1
这是我的最终解决方案:

static int nameArrayCount, markArrayCount = 0;

  static void deleteStudent() {
    System.out.println("Which student would you like to delete?");
    for(int i=0;i<10;i++) {
      System.out.println(i + ": " + studentNamesArray[i]);
    }
    int studentChoice = input.nextInt();
    for(int i = studentChoice+1; i<studentNamesArray.length; i++) {
      studentNamesArray[i-1] = studentNamesArray[i];
    }
    nameArrayCount = nameArrayCount -1;
  }

0

您可以创建一个大小为studentsArray-1的临时数组,然后将除了需要删除的元素之外的所有元素从studentsArray复制到该数组中。

int studentNamesArraySize = studentNamesArray.length;
String [] temp = new String[studentNamesArray.length];
int internalCounter = 0;
for(int i=0;i<studentNamesArraySize; ++i){
    if( i != studentChoice ){
        temp[internalCounter] = studentNamesArray[i];
        internalCounter++;
    }
}
temp[temp.length] = null;
studentNamesArray = temp;

使用临时数组的问题在于它会消耗计算机中额外的内存。对于一个家庭作业问题来说还好,但对于一个大数组来说就不好了。 - Manuel Hernandez

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接