0

これは、QueueAsArray を実装するためのデータ構造の割り当てプログラムです。Javaプログラミングのバックグラウンドがあまりないので、この問題について誰かに教えてもらいたいです。

メインプログラムでこのコードをコンパイルして使用するにはどうすればよいか、誰かに指導してもらいたいです。

public class QueueAsLinkedList extends AbstractContainer implements Queue
{
    protected LinkedList list;

    public QueueAsLinkedList ()
    { list = new LinkedList (); }

    public void purge ()
    {
    list.purge ();
    count = 0;
    }

    public Object getHead ()
    {
    if (count == 0)
        throw new ContainerEmptyException ();
    return list.getFirst ();
    }

    public void enqueue (Object object)
    {
    list.append (object);
    ++count;
    }

    public Object dequeue ()
    {
    if (count == 0)
        throw new ContainerEmptyException ();
    Object result = list.getFirst ();
    list.extract (result);
    --count;
    return result;
    }

    public Enumeration getEnumeration()
    {
        return new Enumeration()
        {
            protected LinkedList.Element position = list.getHead();

            public boolean hasMoreElements()
            {
                return position != null;
            }

            public Object nextElement()
            {
                if (position == null)
                    throw new NoSuchElementException();
                Object result = position.getDatum();
                position = position.getNext();
                return result;
            }
        };
    }

    protected int compareTo (Comparable object)
    {
        AbstractContainer arg = (AbstractContainer) object;

        long diff = (long) getCount() - (long) arg.getCount();
        if (diff < 0)
            return -1;
        else if (diff > 0)
            return +1;
        else
            return 0;
    }

    public boolean equals(Object object) {
        LinkedList list_object = (LinkedList)object;
        if(list_object.length != this.length) {
            return false;
        }
        Element ptr = this.head;
        Element list_object_ptr = list_object.head;
        for(int i = 0; i < this.length; i++) {          
            if(list_object_ptr.getDatum () != ptr.getDatum ()) {
                return false;
            }
            ptr = ptr.getNext ();
            list_object_ptr = list_object_ptr.getNext ();
        }
        return true;
    }
}
4

1 に答える 1

1

私の提案は、既存の LinkedList ライブラリのソースを読んで、簡単に見つけられるものにすることです。配列をラップするので、ArrayList のソースも読むことをお勧めします。最後に ArrayBlockingQueue を見てください。これは配列をラップする Queue であるためです。この最後のクラスは、必要なものに最も近いものですが、同時実行でスレッド セーフであるため、最も複雑です。

クラスを書き始めるときは、本当に単純なものから始めて、それをコンパイルすることをお勧めします。IDE を使用すると、コードを入力して修正を提案すると、コードがコンパイルされるかどうかが表示されます。

次に、非常に単純なコードをテストするための非常に単純な単体テストを作成します。これはたった 1 つの方法で行うことができます。(最初にテストケースを書くことを提案する人もいますが、この種のクラスを以前に書いていない限り、これは非常に難しいと思います。その場合、最初に単体テストを書いているわけではなく、そのコードベースに対して初めてです)

次に、2 番目または 3 番目のメソッドを追加し、それらをテストします。

理解できないことを実行する場合は、デバッガーを使用してコードをステップ実行し、各行の動作を確認してください。


Netbeans、Eclipse、IntelliJ CE などの IDE を使用します。私は IntelliJ を好みますが、初心者には Netbeans がおそらく最適です。

  • IDE をダウンロードします。
  • 新しいプロジェクトを開始します。
  • クラスを作成し、コードをコピーしてそのクラスに貼り付けます。
  • そのクラスを使用する別のクラスを作成します。これはあなたのクラスです。

ところで、クラスを作成したのはあなたですか、それとも珍しいコーディングの選択肢がいくつかあるため、あなたに与えられたのですか。


コードに関するコメント

  • Queue を実装するクラスをラップする Queue であるため、委譲は自然に見えますが、これを行うようには見えず、混乱を招く標準の LinkedList および Queue ではないことLinkedListを示唆しています。Queue
  • countLinkedList.size() の代わりに定義されていないフィールドを使用します。
  • dequeue は LinkedList に 2 回アクセスしますが、1 回の方が効率的です (標準ライブラリのように)。
  • Java 1.2 (1998) 以降、Iterator が標準であった場合、Iterator の代わりに Enumeration をサポートします。
  • equals が false の場合、compareTo は 0 です。これはバグです。
  • 組み込みのジェネリックがサポートするジェネリックはサポートされていません。
  • compareTo は長さのみを調べるため、"A" のキューと "Z" のキューは compareTo == 0 です。
  • equals usesthis.headで、this.lengthフィールドではありません。
于 2012-08-04T08:40:20.280 に答える