我想在我的优先级队列中保留两个东西......一个是数字,另一个是成本。即我想做以下事情:
PriorityQueue<Integer, Cost> q=new PriorityQueue<Integer, Cost>();
成本是另一个我喜欢的课程:
class Cost implements Comparable<Cost>
{
String name;
double cost;
@Override
public int compareTo(Cost s)
{
return Double.compare(cost, s.cost);
}
}
此外,我只想根据成本进行比较......但我也想要一些整数标识符与成本一起传递......有没有办法实现这个目标?
我需要根据id检索Cost。因此我正在使用哈希映射。在成本中使用id字段时...我想基于该id字段检索整个成本实例...是否可能......是的,那么如何?
我是Java编程的新手。有人可以提出一些建议吗?
答案 0 :(得分:1)
更改您的Cost
课程
public class Cost implements Comparable<Cost> {
String name;
double cost;
int id;
public Cost(int id, String name, double cost) {
this.id = id;
this.name = name;
this.cost = cost;
}
@Override
public int compareTo(Cost s) {
return Double.compare(cost, s.cost);
}
public int getId() {
return this.id;
}
@Override
public String toString() {
return new StringBuilder().append("id : ").append(id).append(
" name: ").append(name).append(" cost :").append(cost)
.toString();
}
}
然后,您只需声明PriorityQueue
Const
即可
PriorityQueue<Cost> q=new PriorityQueue<Cost>();
现在,当您想要根据Cost
找到id
时,您可以在下方
PriorityQueue<Cost> queue = new PriorityQueue<Cost>();
queue.add(new Cost(1, "one", 1));
queue.add(new Cost(2, "two", 2));
int id = 2;// Id to be found
for (Cost cost : queue) {
if (cost.getId() == 2) {
System.out.println(cost);
}
}
答案 1 :(得分:0)
Cost
对象是一个好的开始。创建一个包含整数和Cost
的对象,并将那些放在优先级队列中。或者,将一个整数字段添加到Cost
类本身。
答案 2 :(得分:0)
您可能希望将整数和费用包装在Map/HashMap
中,如下所示:
PriorityQueue<Map<Integer, Cost>> q = new PriorityQueue<Map<Integer, Cost>>();
现在,您可以创建一个HashMap对象,并在放入队列之前将两个对象放入其中。
此外,您还要创建自定义包装类,例如CostNumber
将Integer和Cost作为两个成员变量。完成后,您可以在队列中使用该新对象。
答案 3 :(得分:0)
由于PriorityQueue存储单个对象,因此您需要执行以下操作之一:
此外,我只想根据成本进行比较......但我也想要一些整数标识符与成本一起传递......有没有办法实现这个目标?
为什么你要传递一些东西来比较你在比较期间不会使用?在任何情况下,如果要利用Comparator框架,则无法更改此方法的签名。您可以将该整数标识符作为另一个成员添加到Cost类本身,从而在compareTo方法执行期间使其可用。