gpt4 book ai didi

java - Java 中的优先级队列

转载 作者:搜寻专家 更新时间:2023-11-01 03:59:42 27 4
gpt4 key购买 nike

你能有2个参数吗?例如,我想向优先级键添加一个字符串和一个相应的整数。然后我将按该整数对其进行排序。我知道如何添加一个字符串或一个整数,但我不知道如何添加两者。有人可以给我指出正确的方向,让我知道我是否以正确的方式进行此操作吗?

最佳答案

有两种方法可以做到这一点。无论哪种方式,您都希望创建一个包含字符串(您想要的值)和整数(优先级)的自定义对象。

第一个解决方案是让这个数据对象实现 Comparable :

class Data implements Comparable<Data> {
private final String message;
private final int priority;

public Data(String message, int priority) {
this.message = message;
this.priority = priority;
}

@Override
int compareTo(Data other) {
return Integer.valueOf(priority).compareTo(other.priority);
}

// also implement equals() and hashCode()
}

然后当你这样做

PriorityQueue<Data> queue = new PriorityQueue<Data>();

队列将按照 compareTo 方法定义的顺序对项目进行排序。

此解决方案的问题在于,如果您希望仅对整数进行排序,那么 equals 方法和您的 compareTo 方法将不一致,或者您的equals 方法将不正确。

更好的解决方案是使用 PriorityQueue采用 Comparator 的构造函数.在这种情况下,Data 不必实现 Comparable;你只需要一个 Comparator 来定义你的顺序:

public final class OrderDataByPriority implements Comparator<Data> {
public static final OrderDataByPriority INSTANCE = new OrderDataByPriority();

private OrderDataByPriority() {}

@Override
public int compare(Data data1, Data data2) {
return Integer.valueOf(data1.priority).compareTo(data2.priority);
}

@Override
public boolean equals(Object other) {
return other == OrderDataByInteger.INSTANCE;
}

private Object readResolve() {
return INSTANCE;
}
}

请注意,由于此比较器不接收任何数据,因此我将其设为单例。

然后您可以这样创建队列行:

PriorityQueue<Data> queue = new PriorityQueue<Data>(
initialCapacity, OrderDataByPrority.INSTANCE);

关于java - Java 中的优先级队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4011560/

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