2016-11-10 13 views
1

次の問題があります。エントリと呼ばれるオブジェクトを含むリンクリストまたは位置リストがあります。各エントリには、キーと値のペアが格納されます。私はそのリストからキーだけをつかむ別のリンクされたリストを作成したい。私はそうする方法を思いついたのですが、何らかの理由でそれらを追加した順序は、私がキーリストを印刷するときには表されません。 printKeySetは、キーセット(の結果をとり)全体キーリストを出力しながらのkeySet()メソッドは、キーのみを含むリストを返す他のリンクリストからキーを含むリンクリストを返す

public PositionalList1<K> keySet() //I prnted position by position while adding and it worked. I also tested addAfter with positionalList1 class and it worked 
{ 
    PositionInterface<Entry> iterator = map.first(); //gets first position in the Entry List 
    PositionInterface<K> first = keyList.addFirst((K)iterator.getData().getKey()); //adds to list containing just keys the key from the Entry list(getData is just a method that returns whatever object is stored at the node, in this case a Entry Object) 
    iterator = map.after(iterator); //go to next node in Entry list 

    for(int i=0;i<size-1;i++) //get rest of keys 
    { 
     PositionInterface<K> p = keyList.addAfter(first,(K)iterator.getData().getKey()); 
     iterator = map.after(iterator); 

    } 
    return keyList; 
} 

public void printKeySet(PositionalList1 list) //print key list 
{ 
    PositionInterface p = list.first(); 
    for(int i=0; i<list.size();i++) 
    { 
     System.out.println("Key : " + p.getData()); 
     p = list.after(p); 
    } 
} 

:私は、次の2つの方法を持っています。これは、などの順序付きリスト(1、C)(2、A)...の結果

OrderedMapL<Integer,String> map2 = new OrderedMapL<Integer,String>(); 
    map2.put(2,"A");//adds (2,A) 
    map2.put(5,"B");//adds(5,B) 
    map2.put(1,"C");//adds(1,C) 
    map2.put(4,"D");//adds(4,D) 
    map2.put(3,"E");//adds(3,E) 
    map2.remove(2); //removes (2,A) 

とエントリー自体がこの順に細かい印刷:私は、主に以下のプログラムを使用して、これをテストしています。以下を呼び出すときに、問題が発生:

PositionalList1<Integer> keyList = map2.keySet(); 
map2.printKeySet(keyList); 

キーが順番に印刷されているいくつかの理由:1,5,4,3の代わりに、1,3,4,5-と私は理由は分かりません。どんな助けもありがとう。

+0

あなたが独自のカスタムクラスのような外観を使用しているすべてのクラス:私が正しくあなたのコードを理解していれば

あなたはこのようにそれを変更する必要があります。彼らが何をし、どのように働くのか分かりません。なぜ標準Javaコレクションを使用しないのですか? –

+0

これは、私自身の抽象データ型を記述することが期待されるデータ構造体クラスです。ノードリスト自体に関連するすべての補助機能が動作し、テストされています。 addAfter()は、パラメータ化された位置の後に位置を追加するだけです。これは、keySet()で位置1を1つずつ印刷したときの位置が正しく追加されたときと同じです。 printKeySet()では、この順序は表されません。 – JmanxC

+0

また、after()もparamateziedの後の位置を返す別のnodelist関数です。関数の名前は、それが何をしているかをほとんど知らせます。 – JmanxC

答えて

1

問題は、この行を次のとおりです。

PositionInterface<K> p = keyList.addAfter(first,(K)iterator.getData().getKey()); 

あなたはfirst後に追加してはいけません。そういうわけで、あなたは間違った順序を取得します。

キーはその後、あなたはこのようにそれを1, 3, 4, 5を追加しているしている場合:

  1. は1 3 4
  2. 1 4 3最初の要素の後に追加
  3. 1 3最初の要素の後に追加
  4. 1最初の要素として追加最初の要素の後に5を加えます。 1 5 4 3

これは、最初の要素の後に追加するためです。

// I suspect that #addFirst method returns added list element 
PositionInterface<K> last = keyList.addFirst((K) iterator.getData().getKey()); 
iterator = map.after(iterator); 

for(int i = 0; i < size - 1; i++) 
{ 
    // I suspect that #addAfter method returns added list element 
    PositionInterface<K> last = keyList.addAfter(last, (K) iterator.getData().getKey()); 
    iterator = map.after(iterator); 

} 
+0

エラーの大きな説明...しかし解決策はありますか? – joc

+0

うわー、あなたは愚かな間違いに感謝します! – JmanxC

関連する問題