2010-11-24 14 views
0

マイSSCE:リストの自然順序付けに従ってソートされたPQを作成する方法は?

public class ComparableItem implements Comparable<ComparableItem> { 

    private final int itemNo; 

    public ComparableItem(final int itemNo) { 
     this.itemNo = itemNo; 
    } 

    @Override 
    public int compareTo(ComparableItem o) { 
     if (this.itemNo < o.itemNo) { 
      return -1; 
     } else if (this.itemNo > o.itemNo) { 
      return 1; 
     } 
     return 0; 
    } 
} 

ここでは、問題を示してテストです。コードは、PQの作成後に中断されます。上記の行は、compareTo(..)によって定義された自然順序付けが期待通りに機能することを証明することです。 PQの要素を印刷する:14,9,15,5,6,3対15,14,9,6,5,3。誰かが私になぜこれが理由であるか説明することができましたか?

import org.junit.Test; 
import java.util.*; 
import static org.junit.Assert.*; 

public class CompTest{ 

@Test 
public void aTest() { 

    Integer[] order = {9, 3, 14, 15, 6, 5}; 
    List<ComparableItem> items = new ArrayList<ComparableItem>(order.length); 
    for (int i = 0; i < order.length; i++) { 
     items.add(new ComparableItem(order[i])); 
    } 

    List<ComparableItem> greater = new ArrayList<ComparableItem>(); 
    testCompare(items, items.get(3), greater, true); 
    testCompare(items, items.get(2), greater, true); 
    testCompare(items, items.get(0), greater, true); 
    testCompare(items, items.get(4), greater, true); 
    testCompare(items, items.get(5), greater, true); 
    testCompare(items, items.get(1), greater, true); 

    final PriorityQueue<ComparableItem> itemsQueue = new PriorityQueue<ComparableItem>(items); 
    greater = new ArrayList<ComparableItem>(); 
    for (ComparableItem c : itemsQueue) { 
     testCompare(itemsQueue, c, greater, false); 
    } 
} 

public static void testCompare(final Collection<ComparableItem> items, final ComparableItem item, final List<ComparableItem> greater, boolean bigger) { 
    final int exp = (bigger)? -1:1; 
    for (ComparableItem c : items) { 
     final int expected = c.equals(item) ? 0 : greater.contains(c) ? exp : exp*-1; 
     assertEquals(expected, item.compareTo(c)); 
     assertEquals(expected * -1, c.compareTo(item)); 
    } 
    greater.add(item); 
} 

}

new PriorityQueue<ComparableItem>(items); 

指定されたコレクションで 要素を含むPriorityQueueを作成します。 指定されたコレクションがSortedSetの インスタンスであるか、別の PriorityQueueである場合、この優先度キュー は同じ の順序に従って並べ替えられます。それ以外の場合は、この優先度 キューは、その要素の自然順序付けに従って に基づいて並べ替えられます。

答えて

2

私は問題がキューにないと思っていますが、テストしている方法ではありません。特に、PriorityQueue.iterator()状態のjavadoc:

は、このキューの要素の反復子を返します。イテレータは特定の順序で要素を返しません。

およびクラスのJavadocは、この言葉:特定の順序で優先度キューの要素を横断することが保証されていない()メソッド・イテレータに設け

イテレータ。オーダートラバーサルが必要な場合は、Arrays.sort(pq.toArray())の使用を検討してください。

+0

あなたは正しいです。これにより、テストが実行されます。 while(!itemsQueue.isEmpty()){ ComparableItem c = itemsQueue.poll(); testCompare(itemsQueue、c、greater、false); } – simpatico

関連する問題