別の 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;
}
}
ただし、組み込みデータ型の機能が 1 つint[]
欠落しています。これはint[]
iterable であるため、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");
}
};
}
}
上記のように、 asは参照型ではなくプリミティブ型のIterator<Integer>
代わりに使用しています。これにより、プログラムの実行時にオートボクシングとアンボクシングが強制されます。したがって、クラスのループは、オーバーするほど効率的ではありません。Iterator<int>
int
for-each
ArrayOfInt
int[]
しかしint[]
、int の基になる配列として使用することが許可されていない場合は、クラスArrayOfInt
をまったく異なる方法でコーディングする必要があります。最初に、どのようなデータ構造にArrayOfInt
なるかを決定する必要があります。iterator()
クラスのメソッドはArrayOfInt
、ツリーの順序どおりのトラバーサルを返します。) 次に、そのデータ構造に対して少なくとも 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
。したがって、 (a )arr[index]=value;
にアクセスしようとしたステートメントが NullPointerException をスローしました。arr
null
[次の行は 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);
}
コードに冗長性(繰り返しステートメント)を作成します。