在优先级队列中传递2个泛型

时间:2012-10-27 05:28:53

标签: java

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

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编程的新手。有人可以提出一些建议吗?

4 个答案:

答案 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存储单个对象,因此您需要执行以下操作之一:

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

此外,我只想根据成本进行比较......但我也想要一些整数标识符与成本一起传递......有没有办法实现这个目标?

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