簡體   English   中英

使用將Comparator作為參數實現的類時出現問題

[英]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>的子類型一樣,因為StringObject是不同的,即使StringObject的子類型。

如果要對Map.Entry的參數使用通配符,則還需要在Comparator的參數級別使用通配符,如下所示:

Comparator<? extends Map.Entry<? super K, ? super V>>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM