你好我有这个基本完全工作的排序向量,但问题是我只能在插入任何值之前将数组初始化为固定大小,所以例如我可以初始化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;
}
}
答案 0 :(得分:1)
要动态增加数组大小,请使用Collection
框架接口List
,
它有实现ArrayList
,Vector
和LinkedList
使用其中的任何一个。
或者,只需创建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
用于常规/专业目的。
但如果是出于学习目的,那么你可以从之前的答案中选择任何一个。