3

私はかなり長い間プログラミングを行ってきましたが、問題があります。私がやろうとしているのは、組み込みデータ型 int[] と同じ機能を持つクラスを実装することです。

次の方法が提供されました。

public ArrayOfInt(int size); 
public int length(); 
public int get(int index); 
public void put(int index, int value);

主な方法は、コードをテストすることです。

どこから始めればよいのか、ほとんどわかりません。誰か助けてくれませんか?

編集:これが私の更新されたコードです。d.put(0,1) を使用しようとすると、nullpointerexception エラーが発生します。これは、現在混乱しているものです。d.put(0,1) はインデックスと値の整数を定義すべきではありませんか?

public class ArrayofIntegers

{

private int[] arr;


public  int ArrayOfInt(int size)

{

     arr = new int[size];

    return size;

}

public int length()
{

    return arr.length;

}

public int get(int index)

{

    return arr[index];

}

public void put(int index, int value)

{

    arr[index]=value;
    System.out.print(arr[index]=value);

}

public static void main(String[] args)

{
    ArrayofIntegers d = new ArrayofIntegers();
    d.put(0,1);

}

}

4

3 に答える 3

6

Java には、List. はジェネリックなので、次のようにofListを作成できます。ListInteger

List<Integer> intList = new ArrayList<Integer>(); // can be ArrayList<> in java 1.7

Listインターフェースの利点を享受してください。組み込みの実装 (LinkedListや などArrayList) が十分でない場合AbstractListは、Java Collections Framework で提供されている をいつでも拡張できます。

さらにヘルプが必要な場合は、公式ドキュメントを確認してください: Java リスト

于 2012-11-05T10:31:04.900 に答える
2

別の 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>intfor-eachArrayOfIntint[]

しかし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 をスローしました。arrnull

[次の行は 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);
}

コードに冗長性(繰り返しステートメント)を作成します。

于 2012-11-05T11:59:45.960 に答える
2

java.util.ArrayListリスト実装である組み込みライブラリですでに利用可能です。ドキュメント
を見つけてください。

于 2012-11-05T10:32:36.853 に答える