【问题标题】:Delete array element - move all elements down one index删除数组元素 - 将所有元素向下移动一个索引
【发布时间】:2013-11-28 11:03:51
【问题描述】:

我的代码允许用户从他们选择的数组中删除一个元素,但是我想将所有现有元素“向下移动”,这样数组中就不会留下任何间隙。

目前,如果我删除第一个元素(索引 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;
    }
  }

【问题讨论】:

标签: java arrays sorting


【解决方案1】:

我重写了您的代码,但添加了一个临时数组,该数组存储除了第一个索引位置的已删除元素之外的所有值。这应该删除元素并将数组移动到最左边的位置,最右边的位置为空。

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;
}

【讨论】:

  • 我刚刚编辑了我的原始帖子,你添加了这个,这会解决我更新的问题吗?
  • 不,我在您的删除方法中没有发现问题,最初只是提供了一个我知道可行的替代解决方案。给我看一下 add 方法,如果我发现问题,我会编辑。
  • 谢谢,我认为这可能与nameArrayCount 有关,因为我每次添加一个元素时都会添加 1,所以如果我添加 4,那么计数为 3,但如果我删除 [ 1] 计数仍为 3,所以当我添加一个新学生时,计数变为 4。
  • 我已在 delete 方法的末尾添加了nameArrayCount = nameArrayCount -1;,它似乎有效。
  • 我正要发布那个:)。此外,除非您将 0 视为学生,否则您应该执行 "studentNamesArray[nameArrayCount-1] = studentName;"或者您可能会超出最大名称计数的范围
【解决方案2】:

这是我的最终解决方案:

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;
  }

【讨论】:

    【解决方案3】:

    你可以声明一个新的数组少一个元素并使用复制相关值

    http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#arraycopy(java.lang.Object, int, java.lang.Object, int, int)

    【讨论】:

      【解决方案4】:

      您可以创建 size = 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;
      

      【讨论】:

      • 临时数组的问题是它消耗了机器中的额外内存。适合家庭作业问题,但不适合大型数组
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 2021-11-24
      • 2020-04-24
      • 1970-01-01
      相关资源
      最近更新 更多