gpt4 book ai didi

java - 使用实现 Comparator 作为参数的类时出现问题

转载 作者:行者123 更新时间:2023-11-30 08:13:26 26 4
gpt4 key购买 nike

我有一个 map 需要根据非常具体的条件进行排序,因此我创建了以下类:

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<K, V>> 。刚开始时,我总是很难全神贯注( superextends )。

[更新]

有一个关于 <? super XXX> 的很好的部分和<? extends XXX>在《Effective Java》第二版中:“第 28 条:使用有界通配符提高 API 灵 active ”,特别是在他们谈论“PECS”——Producer-Extends、Consumer-Super 的地方。

我仍然需要更好地研究这种情况的原因,但至少我们有一个起点。

关于java - 使用实现 Comparator 作为参数的类时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30018694/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com