1

次のコードを Java で動作させる方法はありますか?

public class RandomizedQueue<Item> implements Iterable<Item> {  
    private static final int ARRAYSIZE = 8; // default array size
    private Node[] nodeArray;               // contains pointers to the randomized nodes    
    private int size;                       // current size of queue

    private class Node
    {
        private Item item;
        private Node next;
        private Node previos;
    }

    @SuppressWarnings("unchecked")
    public RandomizedQueue()           // construct an empty randomized queue
    {
        nodeArrays = (Node[]) new Object[ARRAYSIZE]; // fix this and everything works!
    }

    // unimportant randomized queue implementation details
    // ...
}

実行時に nodeArray 初期化行でクラッシュし、次のエラーが表示されます。

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [LRandomizedQueue$Node; at RandomizedQueue.<init>(RandomizedQueue.java:18) at Subset.main(Subset.java:6).

問題は、ArrayList<> などのライブラリ データ構造を使用できないことです。これは、カスタムのサイズ変更ルールが必要になるためです。さらに、ArrayList アナログを自分で実装することはできません (私のタスクでは追加のクラスは許可されていません)。

Eclipse でコードnodeArray = new Node[ARRAYSIZE];がコンパイルされず、エラーが発生しますCannot create a generic array of RandomizedQueue<Item>.Node

4

5 に答える 5

2

あなたの問題はこれにあります:

public class RandomizedQueue implements Iterable {
[...] private class Node { private Item item;

まず、おそらく内部クラスではなく、[静的] ネストされたクラスを使用する必要があります。Item標準のコーディング規則を使用していないため、明らかではありません。Node一般的な引数が必要です。そう:

public class RandomizedQueue implements Iterable {
[...] private static class Node { private U item;

したがって、これらの の配列が必要になりますNode<U>。通常、私は a を使用すると言いますがList<Node<U>>、ここではある種の低レベルの効率を求めていると思います。そのため、rawtype の危険な配列を作成し、ジェネリックにキャストする必要があります。

       Node<T>[] nodeArrays = (Node<T>[])new Node[ARRAYSIZE];

実際にフィールドに直接割り当てたいと仮定します。

       nodeArrays = (Node<T>[])new Node[ARRAYSIZE];

おそらくより良い方法は、Node非ジェネリックにしてから「取得」にキャストすることです。

    private static class Node {
       [...]
       Node[] nodeArrays = new Node[ARRAYSIZE];
    [...]
    private T at(int index) {
        return (T)nodeArrays[index];
    }

ところで: 警告を抑制する場合は、1 行でのみ抑制してください。これには、一時変数の導入が必要になる場合があります。

于 2013-10-24T09:19:49.760 に答える
0

コンストラクターNode[] nodeArrays = (Node[]) new Object[ARRAYSIZE]; 内でローカル変数を作成しないでください。RandomizedQueue()

@SuppressWarnings("unchecked")
public RandomizedQueue()           
{
     nodeArray = new Node[ARRAYSIZE]; Now This is fixed 
}
于 2013-10-24T09:19:20.040 に答える
0

あなたはこれをしているはずです。

Node[] nodeArrays = new Node[ARRAYSIZE];
于 2013-10-24T09:16:44.980 に答える
0

内部クラス Node のパラメーター化も参照してください。

class RandomizedQueue<Item> implements Iterable<Item> {
private static final int ARRAYSIZE = 8; // default array size
private Node[] nodeArray; // contains pointers to the randomized nodes
private int size; // current size of queue

private class Node<Item> {
    private Item k;
    private Node next;
    private Node previos;

}

public RandomizedQueue() // construct an empty randomized queue
{
    super();
    nodeArray = new Node[ARRAYSIZE];
}

@Override
public Iterator<Item> iterator() {
    // TODO Auto-generated method stub
    return null;
}
}

内部クラス

于 2013-10-24T09:32:29.477 に答える