优先级队列不能应用于给定类型

时间:2013-04-15 19:18:34

标签: java object queue priority-queue comparable

我是处理优先级队列的新手,并且将此代码格式化错误,我希望我的优先级是与城市的直线距离但是我不相信我正确地将此信息传递给队列。查看API我需要将SLD设置为比较器

  

public PriorityQueue(int initialCapacity,Comparator comparator)

      创建具有指定初始容量的PriorityQueue,该容量根据指定的比较器对其元素进行排序。

但这对我来说并不清楚。

public static void GreedySearchMap(map Romania) {
    boolean done = false;

    city current;

    int numsteps = 10;
    int cursteps;
    int choice;
    int numconnections;
    int totaldist;

    cursteps = 0;
    current = Romania.Arad;
    totaldist = 0;

    /*create queue*/
    PriorityQueue<city> q = new PriorityQueue<city>(city city,int SLD);         
    q.offer(current);
    current.visited = true;

    while (!done) {
        System.out.printf("Step %d, In %s, Distance\t%d\n", cursteps,
                current.getname(), totaldist);

        if (current.getname() == "Bucharest")
            done = true;
        else {

            current = q.poll();
            cursteps++;
            numconnections = current.getconnections();

            for (int i = 0; i < numconnections; i++) {
                choice = i;
                if (current.getcity(choice).visited == false) {
                    //totaldist += current.getdist(choice);
                    q.offer(current.getcity(choice), current.getSLD());
                    current.visited = true;
                }
            }
        }
    }

    System.out.printf("-----------------------\n");
}

我的错误是:

P:\csci395\hw4>javac GS.java
GS.java:85: error: method offer in class PriorityQueue<E> cannot be applied to g
iven types;
                                                            q.offer(current.
getcity(choice), current.getSLD());
                                                             ^
  required: city
  found: city,int
  reason: actual and formal argument lists differ in length
  where E is a type-variable:
    E extends Object declared in class PriorityQueue
 1 error

2 个答案:

答案 0 :(得分:0)

SLD不是Comparator,只是被比较的东西。 您需要创建一个执行实际比较的类,并提交:

new Comparator<city>() {
    @Override
    public int compare(city city1, city city2) {
        return city1.getSLD() - city2.getSLD();
    }
};

阅读java.util.Comparator以获得更多的了解。

  • 编辑 -

但这只是一个错误。您从编译中获得的错误(如编译器的输出中所述)是由于您对PriorityQueue的offer()方法使用了错误的参数。只应传递city:SLD将由您的Comparator实例的代码处理。

答案 1 :(得分:0)

首先,给类一个大写名称。 “城市”可能会产生编译错误。 其次,您的错误消息会告诉您错误。

您应该为您的PriorityQueue提供比较器。 int甚至不是类对象,它是原始类型。查找Java Comparators(java.lang.Comparator)以获取更多信息。