从java中删除数组中的元素

时间:2014-04-17 23:20:51

标签: java arrays

我创建了一个程序,用户输入的命令是:向数组添加数字或从数组中删除元素或打印数组。数组大小为10.

这是测试人员类,

   import java.util.Scanner;
   public class Assignment7 {

   public static void main (String [] args) {

    Scanner scan = new Scanner (System.in);
     final int MAX = 10;
      Numbers nums = new Numbers(MAX);

     char command;
     int value;

     System.out.println
       ("To add an element into the array, type a.");
      System.out.println
     ("To delete an element from the array, type d.");
     System.out.println
     ("To print the current contents of the array, type p.");
      System.out.println
      ("To exit this program, type x.\n");
      System.out.print
      ("Add (a), delete (d), print (p) or exit (x)?:");

      command = scan.nextLine().charAt(0);
       while (command != 'x') {
      if (command == 'a' || command == 'd') {
      System.out.print ("Enter a number: ");
       value = scan.nextInt();
       scan.nextLine();
      if (command == 'a')nums.add(value);
        else nums.delete(value);
        }
       else if (command == 'p') nums.print();
         else System.out.println ("Not a value input");

        System.out.print
        ("Add (a), delete (d), print (p) or exit (x)?: ");
        command = scan.nextLine().charAt(0);
         }
         System.out.println ("Program Complete");
      }
   }

这是我的另一堂课,

       import java.util.*;

       public class Numbers{
    private int[] nums;
    private int size;

    public Numbers(int _size){
    this.nums = new int[_size];
    }

    public void add(int addnum){
    if (size == nums.length)
    {
        System.out.println("Array is full. The value " +addnum + " cannot                be added.");
    }
    else
    {
    nums[size] = addnum;
    size += 1;
    }

        }

      public void delete(int deleteNum){
    if(search(deleteNum) == -1)
    {
    System.out.println("The value " + deleteNum + " was not found and cannot be deleted.");
    }
    else {
        for (int i = nums[deleteNum]; i < nums.length -1; i++){
            nums[i]= nums[i+1];
        }
    }
     }

      public void print(){
    String output ="";
    for(int str: nums){
    output = output + " " + str;
        }
    System.out.println(output);

     }

     private int search(int x){
    int index = 0;
    while(index < size){
        if(nums[index] == x)
        return index;
        index++;
            }
        return -1;
        }
       }

每次我运行程序并输入一个我要删除的号码时,它都不会删除它。它会删除索引中的数字。

例如,如果数组输入为1,2,3,4,5,6,7,8,9,10并且我想删除数字1,则删除索引为1的值,该值将是数字2而不是数字1.

3 个答案:

答案 0 :(得分:1)

我认为你的设计&#34;效率不高。因为在您的小程序中,您的数组大小在运行时会发生变化。你的删除方法也是&#34;很奇怪&#34;。

为什么效率不高?

您正在使用具有固定大小->的静态数组,因此如果您想正确地使用#34;从中删除项目,您需要使用new(size - 1) 1 重新初始化新数组,这就是意大利面条代码操作。

什么是建议?

当你移除或添加新项目时,如何使用可以动态更改其大小的动态数组?它还提供了添加和删除等直接操作方法。

1 您需要重新初始化静态数组(新大小为1),因为如果您要删除&#34;删除&#34;例如2.来自它的项目它将仅被指定为零,因此整个数组看起来像:[1,0,3,4,5,6,7,8,9],期望的目标是[1,3,4] ,5,6,7,8,9]

答案 1 :(得分:1)

tl; dr:使用ArrayList,或将数组操作分离到自己的类中。

如果你想能够在列表中添加和删除,你很可能想要使用一个arraylist,它是一个“引擎盖下”的数组,但它支持动态大小。 使用数组而不是某种集合的最有效原因是出于学习目的,在这种情况下,您应该创建自己的“arraylist”,以便所有与add / deletion / etc相关的代码都包含在自己的类中。只要知道你的实现可能永远不会像ArrayList一样高效和健壮。

当删除元素时,您不需要“调整”数组的大小,只保留一个单独的大小变量,告诉您哪些indeces是“有效”。添加新元素时,如果已超出数组的长度,则必须初始化具有更大大小的新数组,并复制旧数组中的所有元素。

答案 2 :(得分:0)

在删除方法中,您应该存储从搜索方法中获得的值。现在你正在调用nums [deleteNum],它使用输入的数字作为索引。这就是为什么你有2个删除值的原因。你应该做这样的事情:

public static void delete(int deleteNum){
   int index = search(deleteNum);
    if(index == -1)
    {
    System.out.println("The value " + deleteNum + " was not found and cannot be deleted.");
    }
    else {
        int size = nums.length;
        for (int i = index; i < size; i++){
            if(i < (size-1)
                nums[i]= nums[i+1];
            else
                nums[i] = 0; //set to some base case or zero
        }
    }
     }

您将无法删除&#34;最后一个值,但必须将其设置为某个基本情况。如果你想真正删除我。你应该使用另一种数据结构,即ArrayList