[英]Problems using a class that implements Comparator as a parameter
我有一張需要根據特定條件排序的地圖,因此我創建了以下類:
private class EventComparator implements Comparator<Map.Entry<Event, gohs.scyoly.core.Entry>> {
Crew crew;
public EventComparator(Crew crew) {
this.crew = crew;
}
@Override
public int compare(java.util.Map.Entry<Event, Entry> o1,
java.util.Map.Entry<Event, Entry> o2) {
// algorithm for comparing
}
}
然后,我創建了一個單獨的靜態類和函數,該類和函數將使用冒泡排序:
public static <K, V> void mapSort(LinkedHashMap<K, V> map,
Comparator<Map.Entry<? super K, ? super V>> comparator) {
// array list is more efficient
ArrayList<Map.Entry<K, V>> entries = new ArrayList<>(map.entrySet());
int i; // var for iterating
boolean swap = true; // false if no swaps occurred (list is sorted)
Map.Entry<K, V> temp;
while(swap) {
swap = false; // assume no swap will occur
for (i = 0; i < entries.size() -1; i++)
if (comparator.compare(entries.get(i), entries.get(i + 1)) > 0) {
temp = entries.get(i);
entries.set(i, entries.get(i + 1));
entries.set(i + 1, temp);
swap = true;
}
}
// re-factor the original map
map.clear();
for (Map.Entry<K, V> entry : entries)
map.put(entry.getKey(), entry.getValue());
}
要注意的重要事項是函數所采用的參數。 我以為我可以簡單地執行以下操作: mapSort(sorted, new EventComparator(crew))
但是Eclipse警告我第二個參數的類型不正確。 關於如何實現這一目標的任何建議?
按照Tim的要求,下面是調用它的代碼:
// Reduce team size if necessary
if (crew.getSize() > 15) {
System.out.println("Crew reduction neccessary"); // DEBUG
// get list of the next step down in feeder
LinkedHashMap<Event, gohs.scyoly.core.Entry> sorted = new LinkedHashMap<>(feeder.size());
for (Map.Entry<Event, Stack<Entry>> feederEntry : feeder.entrySet()) {
sorted.put(feederEntry.getKey(), feederEntry.getValue().peek());
}
BubbleSort.mapSort(sorted, new EventComparator(crew));
System.out.println(sorted.entrySet()); // DEBUG
}
對於上下文,該應用程序旨在掃描團隊得分以獲取事件,然后將其存儲為條目,然后輸出完美的“團隊”,這是一組在事件中競爭的團隊的集合。
更新:我將代碼更改為以下內容:
BubbleSort.mapSort(sorted, (Comparator<Map.Entry<Event, gohs.scyoly.core.Entry>>) new EventComparator(crew));
但是,以下消息仍然給我一個錯誤:
The method mapSort(LinkedHashMap<K,V>, Comparator<Map.Entry<? super K,? super V>>) in the type Assembler.BubbleSort is not applicable for the arguments (LinkedHashMap<Event,Entry>, Comparator<Map.Entry<Event,Entry>>)
[摘自我的評論]
對於sortMap的簽名,更改Comparator<Map.Entry<? super K, ? super V>>
Comparator<Map.Entry<? super K, ? super V>>
Comparator<Map.Entry<? super K, ? super V>>
為Comparator<Map.Entry<K, V>>
。 剛開始時,我總是很難確定要解決的問題( super
vs extends
)。
[更新]
關於<? super XXX>
<? super XXX>
和<? extends XXX>
在有效Java,第二版中<? extends XXX>
:“第28項:使用有界通配符以提高API的靈活性”,尤其是當他們談論“ PECS”時-生產者擴展,消費者超級。
在這種情況下,我仍然需要對原因進行更好的研究,但至少我們有一個起點。
Comparator<Map.Entry<Event,Entry>>
不是Comparator<Map.Entry<? super K, ? super V>>
的子類型Comparator<Map.Entry<? super K, ? super V>>
Comparator<Map.Entry<? super K, ? super V>>
Comparator<Map.Entry<? super K, ? super V>>
,因為Comparator
的類型參數不同。 就像List<String>
不是List<Object>
的子類型一樣,因為String
和Object
是不同的,即使String
是Object
的子類型。
如果要對Map.Entry
的參數使用通配符,則還需要在Comparator
的參數級別使用通配符,如下所示:
Comparator<? extends Map.Entry<? super K, ? super V>>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.