自动增量数组java

时间:2015-02-09 12:31:47

标签: java

你好我有这个基本完全工作的排序向量,但问题是我只能在插入任何值之前将数组初始化为固定大小,所以例如我可以初始化5但是如果我想要插入6个项目它给了我一个空指针异常。 我想我确实理解发生了什么,但我希望有人向我展示一个解决方案,每次我想插入一些东西时,如何自动增加数组大小。 (无需使用任何内置的java功能,如ArrayList)

谢谢


package ads2;

public class SortedVector2
{
    private int length;
    private int maximum;
    private int growby;
    private int temp; 
    private int x = 0;        
    private int high;   
    private int middle; 
    private int low;  


    String[] data;

    public SortedVector2() 
    {

        length = 0;

        maximum = 5;
        data = new String[maximum];


    }

    public void AddItem(String value) 
    {

        /*if (length == maximum)    
        {
        maximum += 200000;
        */

        data[length] = value;

        length++;
      //  SetSorted();
       // SetSorted(data);

    }

    public void SetSorted() 
    {

        for (int j = 0; j < data.length - 1; j++) {
           if (data[j].compareTo(data[j + 1]) > -1) {
                String temp = data[j];
                data[j] = data[j + 1];
                data[j + 1] = temp;
            }

       }
        for (String s : data) {
         System.out.println(s);
       }

       // private String[] data;

        /*
       for(int i = data.length-1; i >= 0; i--) {
       for(int j = 0; j < i; j++) {
        if(data[j].compareTo(data[j + 1]) > -1) {
            String temp = data[j];
            data[j] = data[j + 1];
            data[j + 1] = temp;
        }
       }
      }  for (String s : data) {
        System.out.println(s);
    }
                */
    }

    public void SetGrowBy(int growby)     
    {
       maximum += growby;
    }


    public int GetCapacity() 
    {
        return maximum;
    }


    public int GetNoOfItems() 
    {
        return length;
    }


    public String GetItemByIndex(int index) 
    {
        return data[index];
    }

     public int FindItem(String search)
     {

         for (x=0;x<=length; )
         {
            middle =((low + high)/2);
            if (data[middle].compareTo(search)==0)
            {
                return middle;
            }
            else if (data[middle].compareTo(search)<0)  
            {       

               low = middle;
               x++;
               return FindItem(search);
            }
            else
            {

               high = middle; 
               x++;
               return FindItem(search);
            }
     }
     return -1;
    }

    public boolean Exists(String search) 
    {
        boolean output;

        int y;
        y = 0;

        while (data[y] != search && (length - 1) > y)
        {
            ++y;
        }

        if (data[y] == search) 
        {
            output = true;
        } else 
        {
            output = false;
        }

        y = 0;

      return output; 

    }

    public void InsertItem(int index, String value) 
    {
        if (length == maximum) 
        {

        maximum += 200000;

        }

        for(int i = length - 1; i >= index; --i) 
        {

            data[i + 1] = data[i];

        }

        data[index] = value;

        length++;
    }


    public void DeleteItem(int index) 
    {
       for(int x = index; x < length - 2; ++x) 
       {

            data[x] = data[x + 1];

        } 

       length--;
    }

    public String toString()
    {
        String res = "";


        for (int i=0; i<length; i++)
            res+=data[i] +  "; ";

        return res;
    }

}

5 个答案:

答案 0 :(得分:1)

要动态增加数组大小,请使用Collection框架接口List, 它有实现ArrayListVectorLinkedList使用其中的任何一个。

或者,只需创建copyArray(String[]) api,它将为您提供更大容量的数组。

public String[] copyArray(String[] oldArray){
  int capacity = oldArray.length * 2;
  return Arrays.copyOf(oldArray, capacity);
}

String[] data = copyArray(data) // pass array 

答案 1 :(得分:1)

你必须做ArrayList的实现者所做的事情。当您尝试在数组已满时添加元素时,您将创建一个更大的数组,将现有元素复制到该数组并添加新元素。

答案 2 :(得分:0)

我认为你已经拥有了你需要做的所有基本变量:只需检查大小是否等于添加项目时的容量以及是否重新分配了数组:

if (size == capacity) {
    capacity += growby;
    data = Arrays.copyOf(data, capacity);
}

几乎所有ArrayList都可以。

答案 3 :(得分:0)

增加数据缓冲区的大小时需要重新分配,例如

public void InsertItem(int index, String value) 
{
  String[] data2;
  if (length == (maximum-1))
  {
    maximum += 5; // increment size in lot of 5
    data2 = new String[maximum);
    for (int ii = 0; ii < length; ii++) 
    {
      data2[ii] = date[ii];
    }
    data = data2; // re-assign with increased size
  }
  for(int i = length - 1; i >= index; --i) 
  {
    data[i + 1] = data[i];
  }
  data[index] = value;
  length++;
}

答案 4 :(得分:0)

在软件工程中有一种说法,“ Don't reinvent the wheel ” - 强调我们使用现有的原型。因为它们经过长时间的测试和使用。因此,最好将ArrayList用于常规/专业目的。

但如果是出于学习目的,那么你可以从之前的答案中选择任何一个。