4

ええ、それは宿題の質問なので、givemetehkodezplsthx! :)

とにかく、ここで私がしなければならないことは次のとおりです
。属性の中に別のクラスのオブジェクトの配列を持つクラスが必要です。私の意見では、これを行う適切な方法は、LinkedList、Vector などを使用することです。残念なことに、前回それを行ったとき、教授から火と硫黄をもらいました。彼の信念によれば、基本を理解せずに高度なものを使用していたからです。

次の明らかな解決策は、固定数の要素で配列を作成し、配列がいっぱいかどうかを確認する get および set にチェックを追加することです。いっぱいになると、新しいより大きな配列が作成され、古い配列のデータが新しい配列にコピーされ、新しい配列が呼び出し元に返されます。ほとんど空の場合、新しい小さな配列を作成し、古い配列から新しい配列にデータを移動します。私には、これは少しばかげているように見えます。私の宿題では、配列に 3 つ以上の要素が存在しない可能性がありますが、配列が埋められる頻度、追加された新しい要素の平均数についての統計を手動で計算せずに、スケーラブルなソリューションを作成したいと考えています。計算結果を使用して、新しい配列の要素数などを計算します。

ちなみに、配列の途中から要素を削除する必要はありません。

任意のヒント?

4

6 に答える 6

6
class test {
    private Object[] objects;
    private int size;

    public test() {
        objects = new Object[10];
        size = 0;
    }

    public void push(Object o) {
        if (objects.length == size) {
            throw new RuntimeException("This wouldn't happen if I didn't have to reinvent the wheel");
        }
        objects[size] = o;
        size++;
    }

    public Object pop() {
        size--;
        Object o = objects[size];
        objects[size] = null;
        return o;
    }
}

冗談だ。最善の策は、独自のリンクリストを実装し、それをクラスで使用することだと思います。何かのようなもの:

class Element {
    Object val;
    Element next;
    Element prev;

    public Element(Object val, Element next, Element prev) {
        this.val = val;
        this.next = next;
        this.prev = prev;
    }

}

class LinkedList {
    Element head;
    Element tail;

    public void add(Object o) {
        Element el = new Element(o, null, tail);
        tail.next = el;
    }

    public Object remove() {
        Element o = tail;
        tail = o.prev;
        tail.next = null;
        return o.val;
    }
}
于 2010-05-26T15:48:59.560 に答える
4

配列のサイズを大きくする必要がある場合は、古い配列の2倍のサイズの配列を作成します。同様に、配列のサイズを縮小する必要がある場合は、配列が半分いっぱいになったときにのみ実行してください。

これにより、配列のコピーを大幅に減らすことができます。

これを行うと、配列の長さが実際のサイズを正確に表さないため、配列の実際のサイズを追跡する変数を保持する必要があります。

于 2010-05-26T15:24:08.197 に答える
3

既存の配列を小さい配列または大きい配列にコピーするには、System#arrayCopy()便利な場合があります。

キックオフの例:

Object[] originalArray = new Object[3];
// ...
Object[] resizedArray = new Object[originalArray.length + 2]; // Grow with 2.
System.arrayCopy(originalArray, 0, resizedArray, 0, originalArray.length);

これにより、の全長にわたってアイテムがoriginalArrayの先頭にコピーされresizedArrayます。の端にある2つのスロットresizedArrayはまだ残っnullているので、他のアイテムに使用できます。

これはあなたが始めなければなりません。幸運を :)

于 2010-05-26T15:23:57.073 に答える
1

データ構造クラス用ですか?あなたの教授は、Java が提供するものを使用する代わりに、独自のLinked Listデータ構造または類似のものを実装することを期待しているようです。Google とあなたの教科書はあなたの友達です。

于 2010-05-26T15:24:33.967 に答える
1

私の記憶が正しければ、ArrayList クラスは、固定サイズの配列 (設定したものの初期容量を持つ) を持つことで機能し、それがいっぱいになると、説明したのとほとんど同じようにサイズが変更されます。

リンクされたリストを使用することもできますが、その響きから、教授は自分でこのようなものをプログラムすることを望んでいるので、それがどのように機能するかを示す独自のクラスを作成しますか?

于 2010-05-26T15:29:30.750 に答える
-1

私はそれが本当に簡単な方法だと思います:pこれはCではできませんがJavaではできます

package javaapplication21;

import java.util.Scanner;
public class JavaApplication21 {
    public static void main(String[] args) {
       int a;
       Scanner obj=new Scanner(System.in);
       System.out.print("Enter array size=");
       a=obj.nextInt();
       int b[]=new int[a];
       for(int i=0;i<b.length;i++){
          System.out.println(b[i]+i);
       }
   }
}
于 2012-05-15T07:17:36.687 に答える