4

我想在我的优先队列中保留两件事……一个是数字,另一个是成本。即我想做以下事情:

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 检索成本 ..因此我使用哈希映射。在成本中使用 id 字段时...我想根据该 id 字段检索整个成本实例...是否可能...是的,那么如何?

我是 Java 编程的新手。有人可以建议一些出路吗?

4

4 回答 4

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);
        }
    } 
于 2012-10-27T05:49:15.160 回答
0

Cost对象是一个好的开始。制作一个同时包含整数和 a 的对象Cost,并将它们放入优先级队列中。或者,向Cost类本身添加一个整数字段。

于 2012-10-27T05:31:47.207 回答
0

您可能希望将整数和成本包装在 aMap/HashMap中,如下所示:

   PriorityQueue<Map<Integer, Cost>> q = new PriorityQueue<Map<Integer, Cost>>();

现在您将能够创建一个 HashMap 对象并在放入队列之前将两个对象放入其中。

此外,您想创建一个自定义包装类,例如CostNumber,它将 Integer 和 Cost 作为两个成员变量。完成后,您可以在队列中使用该新对象。

于 2012-10-27T05:32:35.690 回答
0

由于 PriorityQueue 存储单个对象,因此您需要执行以下操作之一:

  • 创建一个包含整数和成本对象的类,如果整数和成本不相关。
  • 如果它们是相关的,则将整数属性推送为 Cost 类的另一个成员。

另外我想仅根据成本进行比较......但我也希望一些整数标识符与成本一起传递......有什么方法可以实现这一点吗?

为什么要传递一些在比较过程中不会使用的东西来 compareTo?在任何情况下,如果您想利用 Comparator 框架,则无法更改此方法的签名。您可以将该整数标识符作为另一个成员添加到您的 Cost 类本身,从而使其在 compareTo 方法执行期间可用。

于 2012-10-27T05:35:05.157 回答