2016-10-18 19 views
1

以下は、汎用Queueクラスのコードを表しています。今、私が主にやろうとしたことで、Queueクラスを使ってInteger配列の配列を作成しようとしました。しかし、Integer配列の配列内の要素をキューに適切に追加することができなかったため、私は試みても悲惨に失敗しました。 はここにいくつかの説明とコードです:Java:汎用クラスを使用して整数配列の配列を作成する

メイン:

import java.util.Iterator; 

public class Main 
    {public static void main(String[] args) 
     {Queue <Integer[][]> Q= new Queue<Integer[][]>(); // creating the queue 
     Integer []i1={1,2,3}; 
     Integer []i2={1,2,3}; 
     Integer [][]i=new Integer[][]{i1,i2}; // creating the array of integer arrays 
     Q.add(i); 

     for(Iterator<Integer[][]> it=Q.iterator(); it.hasNext();){ System.out.print(it.next()+" "); } 
     System.out.println(); 

     Iterator<Integer[][]> it=Q.iterator(); 
     it.next(); 
     it.remove(); 
     System.out.println(Q); 

     } 
    } 

そして、ここでは、キューのクラスである:だから

import java.util.*; 

public class Queue <T> 
    {LinkedList<T>queue=new LinkedList<T>(); 
    public void add(T x){ queue.add(x); NOF++; } // the regular add function 

    public void add(T[][] x) // the add function in case we get an array of Integer arrays 
     { int i=0,j=0,k=0; T [] v; 
     while(x[i][j]!=null) // checking if the are still availabe arrays 
      { v=x[i][j]; //1 passing to v an array (or at least what I thought I'd pass) 
             //but i don't think it works 
      while(v[k]!=null) // while the arrays has elements, add them to the queue 
       { queue.add(v); 
       j++; 
       NOF++; 
       k++; } 
      j++; } } 


    public void remove(T x){ queue.remove(); } 
    public T peek(T x){ return queue.peek(); } 
    public String toString(){ String S=""; for(T x: queue)S=S + x + " "; return S; } 
    static int NOF=0; 

    public class QueueIterator<T> implements Iterator<T> 
     { int index=0; 
     public boolean hasNext(){ return index < queue.size(); } 
     public T next(){ return (T) queue.get(index++); } 
     public void remove(){ if(index>0)queue.remove(index-1); } } 

    public Iterator<T> iterator(){ return new QueueIterator<T>(); } 

    } 

それは明らかに動作しませんが、私は理解していませんなぜ、// 1でエラーが出るのですか?

Type mismatch, cannot convert from T to T[]

しかし、x [i] [j]は、 T []と同様に編集された。

アイデア、homies?

+0

ヒント:変数名を長さ1に減らす必要はありません。しかし、これをしない理由は非常に多いです。つまり、あなたのクラスを行数で「短く」する誤った努力では、「普通の」Javaの人にとっては読みにくいものを作成します。あなたが知っている、Javaコーディングスタイルガイドがあり、あなたはそれらを全面的に違反しています。 – GhostCat

+0

@GhostCat私はよくそれを行うことが知られていました;) –

+0

これとは反対に、 'v'は' T [] '2行前に宣言されていますが、' x [i] [j] 'は' Tあなたが期待しているとおりです。 –

答えて

1

あなたの問題は、(過度に複雑なコーディングスタイルを与えてちょっと意外!)あなたのキューを作成したいと思われ

非常に単純であるTの2次元のアレイと暗黙的に作品:

class Queue<T> ... 
    public void add(T[][] x) 

しかし、その後、あなたは2次元の配列で再び...その事をインスタンス化されています。その意味で

Queue <Integer[][]> Q = ... 

、あなたはありますここでは「倍増」します。

あなたは、単に物事を動作させるために

Queue <Integer> Q = ... 

にキュー使い方を変更することができます!

しかし、それは間違った解決策になります。あなたは、配列情報をまったく必要としないことを見ています。

Queue実装でTオブジェクトを処理するだけです。 T [] []を使用すると、のいずれもという値は得られません。 Queueクラスのコードのどれも、Tの2次元配列を期待しているという事実に依存していません。

意味:あなたはそのように、そこにあなたがInteger[][]を言い続けるだろう(あなたのクライアントにその情報を置くだろうが:それも間違って次のようになります。なしポイントは、配列やコレクションを混合して存在しないだけかもしれないList<Integer>を使用しますか、 List<List<Integer>>あなたは、実際には2つの次元を必要とする場合

EDIT:。

A)の最初の提案...、あなたの問題を解決し、あなたのQクラスに回すと簡単に任意の[] []あなたがそこに持って削除します。 Mainクラスをそのままにして、コンパイルする必要があります。

B)しかし、Mainクラスの変更も考慮して、配列の代わりにListを使用するようにしてください。

+0

私は申し訳ありませんが、私はかなりあなたに従うことができませんでした。だから、2番目のaddメソッド全体を削除するのは、悪いコードなので、どうすればいいのか分かりません。 –

+0

私の更新された回答を参照してください。 – GhostCat

+0

しかし、もし私がそれを行うと、私はまだエラーが発生します:タイプの不一致、TからT []への変換ができません –

1

あなたはQueue<Integer[][]>ですが、T[][]の追加番号はInteger[][][][]です。ここでジェネリックを使用する場合TInteger[][]です。 T

あなたが複数の個々の要素を追加すること達成したい場合は、その後、あなたは、アレイ(または可変引数)を受け入れることを見ているだろう、とあなたTInteger[]ようなものがあります:

public void addAll(T... values) { 
    //add all from values 
} 

最後に、あなたはコードを一貫してフォーマットして読みやすくする必要があります。

0

は物事を分離するために、ここでうまくコンパイルしたバージョンです: は、私は2つの特別な追加方法、Tのリストを取って1、およびT.

のリストの一覧を取って他のものを持っていると私は日食フォーマッタを通してそれを走らせました;-)

私は確かにNOFカウンタを削除しました。あなたはそれについて内部キューオブジェクトを照会できました!

import java.util.*; 

public class Queue<T> { 
LinkedList<T> queue = new LinkedList<T>(); 

public void add(T x) { 
    queue.add(x); 
} // the regular add function 

public void addAll(List<T> xes) { 
    queue.addAll(xes); 
} // for adding multiple values 

public void addAllTimes2(List<List<T>> xesTimes2) { 
    for (List<T> xes : xesTimes2) { 
     addAll(xes); 
    } 
} // for adding multiple values 

public void remove(T x) { 
    queue.remove(); 
} 

public T peek(T x) { 
    return queue.peek(); 
} 

public String toString() { 
    String S = ""; 
    for (T x : queue) 
     S = S + x + " "; 
    return S; 
} 

public class QueueIterator implements Iterator<T> { 
    int index = 0; 

    public boolean hasNext() { 
     return index < queue.size(); 
    } 

    public T next() { 
     return queue.get(index++); 
    } 

    public void remove() { 
     if (index > 0) queue.remove(index - 1); 
    } 
} 

public Iterator<T> iterator() { 
    return new QueueIterator(); 
} 

public static void main(String[] args) { 
    Queue<Integer> Q = new Queue<>(); // creating the queue 

    List<Integer> i1 = Arrays.asList(1, 2, 3); 
    List<Integer> i2 = Arrays.asList(1, 2, 3); 
    Q.addAll(i1); 
    List<List<Integer>> i = Arrays.asList(i1, i2); // creating the array of integer arrays 
    Q.addAllTimes2(i); 
    for (Iterator<Integer> it = Q.iterator(); it.hasNext();) { 
     System.out.print(it.next() + " "); 
    } 
    System.out.println(); 

    Iterator<Integer> it = Q.iterator(); 
    it.next(); 
    it.remove(); 
    System.out.println(Q); 

} 
} 
+0

おかげで、あなたは本当にクール! –

+0

あなたは大歓迎です! – GhostCat

関連する問題