マイ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である場合、この優先度キュー は同じ の順序に従って並べ替えられます。それ以外の場合は、この優先度 キューは、その要素の自然順序付けに従って に基づいて並べ替えられます。
あなたは正しいです。これにより、テストが実行されます。 while(!itemsQueue.isEmpty()){ ComparableItem c = itemsQueue.poll(); testCompare(itemsQueue、c、greater、false); } – simpatico