Java:扩展数组大小,似乎无法将所有值保留在原始位置

标签 java arrays generic-programming expansion

对于我当前的作业,当用户将值插入数组的位置时,我尝试通过通用类对数组进行排序。当大小读取为完全加载时,数组类会调用一个扩展方法,该方法会增加数组的大小,同时将其值保留在适当的位置,这是我从教授的笔记中遵循的。由于某种原因,除了 location[0] 之外的所有值似乎都被放错位置或从数组中删除。我认为问题源于扩展方法,但我不知道如何解决这个问题。

例如,初始大小当前设置为 5,但在调用扩展方法时会增加 3。用户可以完美输入值1、2、3、4、5。但是当用户输入新值 6 时,会调用扩展,该值输出 1, 6, null, null, null, null 的数组。任何进一步的操作都会导致错误“Exception in thread "main"java.lang.NullPointerException”

这是我的排序数组类:

public class SortedArray {
private int size;
    private int increment;
    private int top;
    Comparable[] a;

public SortedArray(int initialSize, int incrementAmount)
{
        top = -1;
        size = initialSize;
        increment = incrementAmount;
        a = new Comparable [size];
}
public int appropriatePosition(Comparable value)
{
        int hold = top;
        if(hold == -1)
        {
            hold = 0;
        }
        else
        {
            for(int i = 0; i <= top; i++)
            {
               if(value.compareTo(a[i]) > 0)
               {
                   hold = i + 1;
               }
            }
        }
        return hold;
}
public Comparable smallest()
    {
        return a[0];
    }
public Comparable largest()
    {
        return a[top];
    }
public void insert(Comparable value)// the method that my driver calls for.
{
        int ap = appropriatePosition(value);
        //Expansion if full
        if(full() == true)
        {
            expansion();
        }
        //Shifting numbers to top
        for(int i = top; i >= ap ; i--)
        {
            {
                  a[i + 1] = a[i];
            }
        }
        a[ap] = value;
        top++;

    }
public boolean full()
{
    if(top == a.length -1)
    {
        return true;
    }
    else
    {
        return false;
    }
}
public void expansion()//here's where the expansion begins
    {
        int newSize = a.length + increment;
            Comparable[] tempArray = new Comparable[newSize];
            for(int i= 0; i < a.length; i++)
            {
                tempArray[i]= a[i];
                a  = tempArray;
            }
    }

这是我的驱动程序类,它调用 SortedArray 类中的 insert 方法。

public class IntDriver {
 public static void main(String[] args)
 {
     Scanner keyboard = new Scanner(System.in);
     //Creating variables
     int data;
     boolean check = false;
     int choice;
     int size = 5;
     int increment = 3;
     SortedArray b = new SortedArray(size, increment);
     //Creating Menu
     System.out.println("Please choose through options 1-6.");
     System.out.println("1. Insert\n2. Delete\n3. Clear\n4. Smallest\n5. Largest\n6. Exit\n7.Redisplay Menu");
     while(check == false)
     {
     choice = keyboard.nextInt();
     switch(choice)
         {
         case 1:
             System.out.println("Type the int data to store in array location.");
             data = keyboard.nextInt();
             Integer insertObj = new Integer(data);
             b.insert(insertObj);
             System.out.println("The value " + data + " is inserted");
             b.print();
            break;

最佳答案

在扩展方法中,您过早地替换了a。替换应该发生在 for 循环之后:

public void expansion()//here's where the expansion begins
    {
        int newSize = a.length + increment;
            Comparable[] tempArray = new Comparable[newSize];
            for(int i= 0; i < a.length; i++)
            {
                tempArray[i]= a[i];
            }
            a  = tempArray;
    }

关于Java:扩展数组大小,似乎无法将所有值保留在原始位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2121396/

相关文章:

java - 液体碱 : Load data with dates depending on today (plus one day)

java - Selenium Xpath 在 div 标签内查找表格单元格

java - 使用 java 将文件从一台 Solaris 9 复制到另一台

java - Android 数据绑定(bind)监听器 View

javascript - Lodash - 搜索字符串是否包含以开头的单词

java - java中for循环的最小和最大结果

programming-languages - 通用编程与元编程

arrays - 通过 JSON 将对象数组发布到 ASP.Net MVC3

java - 在java中填充通用数组

c++ - 在考虑对齐要求的同时一般重载 operator new