如果您被允许使用另一个 int 数组作为后备数组,那么这段代码对您来说应该足够了:
public class ArrayOfInt{
private final int[] array;
public ArrayOfInt(int size) {
array=new int[size];
}
public int length() {
return array.length;
}
public int get(int index) {
return array[index];
}
public void put(int index, int value) {
array[index]=value;
}
}
但其中一项内置数据类型int[] 的功能将丢失。那就是int[] 是可迭代的,因此for-each 循环可以应用于int[],但不能高于类。所以要让它可迭代,你必须把上面的代码改成这样:
import java.util.Iterator;
public class ArrayOfInt implements Iterable<Integer>{
private final int[] array;
public ArrayOfInt(int size) {
array=new int[size];
}
public int length() {
return array.length;
}
public int get(int index) {
return array[index];
}
public void put(int index, int value) {
array[index]=value;
}
@Override
public Iterator<Integer> iterator() {
return new Iterator() {
private int current_index;
@Override
public boolean hasNext() {
return current_index<array.length;
}
@Override
public Integer next() {
return array[current_index++];
}
@Override
public void remove() {
throw new UnsupportedOperationException("Cannot Resize Underlying Array");
}
};
}
}
正如您在上面看到的,我们使用了Iterator<Integer> 而不是Iterator<int>,因为int 不是引用类型,而是原始类型。这将在程序运行时强制进行一些自动装箱和拆箱。因此,在 ArrayOfInt 类上的 for-each 循环不会像在 int[] 上那样有效。
但是,如果不允许您使用 int[] 作为 int 的底层数组,那么您需要以完全不同的方式对类 ArrayOfInt 进行编码。首先,您必须确定您的ArrayOfInt 将是哪种数据结构。(我更喜欢平衡的二叉搜索树,其节点在构造过程中仅按键排列一次,其中每个节点的键是它的索引。并且在在这种情况下,ArrayOfInt 类的 iterator() 方法将返回树的有序遍历。)然后您必须为该数据结构编写至少 2 个类:(1)ArrayOfInt 和(2) NodeOfInt。这些节点对象如何通过索引链接和搜索,取决于您选择的数据结构。一切顺利。
[这部分答案是在提问者添加更多信息后添加的]
修改这段代码:
public int ArrayOfInt(int size)
{
arr = new int[size];
return size;
}
到这里:
public ArrayOfIntegers(int size)
{
arr = new int[size];
}
并更改这行代码:
ArrayofIntegers d = new ArrayofIntegers();
到这一行:
ArrayofIntegers d = new ArrayofIntegers(10); // Now your array size is fixed at 10
// For an array of size 15 , use statement: ArrayofIntegers d = new ArrayofIntegers(15);
你得到一个 NullPointerException 因为;在 Java 中,每个数组(int[] 或 float[][] 或 String[] 或 AnyClass[] 或 SomeClass[][])都是 class Object 的子类。因此,当您的类ArrayOfIntegers 创建一个新对象时,名为arr 的对象(在名为d 的对象内部)被自动初始化为null。
因此,试图访问 arr(null)的语句 arr[index]=value; 引发了 NullPointerException。
[以下几行与您的 nullpointerexception 无关,但我仍在添加它们以获得高效的代码]
你的函数public void put(int index, int value)应该是这样的:
public void put(int index, int value)
{
arr[index]=value;
System.out.print(arr[index]);
}
或者这个:
public void put(int index, int value)
{
System.out.print(arr[index]=value);
}
但不是这个:
public void put(int index, int value)
{
arr[index]=value;
System.out.print(arr[index]=value);
}
它在代码中创建冗余(重复语句)。