ClassCastException可比较

时间:2016-04-16 09:52:46

标签: java path-finding

我正在制作一个学校项目,我们必须实施A *算法来解决8-puzzle问题。在创建节点并将其添加到队列时,没有问题,但是当我创建第二个节点并尝试将其添加到队列中时,它不能同时对它们进行比较,以检查它是否具有最低的f -cost。

private class Node implements Comparable<Node>{
    private Node parent;
    private int distance;
    private int moves;
    private Board board;

    public Node(Node parent, Board board, int moves) {
        this.parent = parent;
        this.board = board;
        this.moves = moves;
        distance = board.manhattan();
    }

    @Override
    public int compareTo(Node node) {
        return this.moves + this.distance - node.moves - node.distance;
    }
}

这是我创建Node的类。 现在,当试图测试它是否有效时,我创建了一个slamm JUnit测试,看看它是否可行,但是我得到的错误是我的Node类无法转换为类似的。 以下是我尝试运行的测试代码:

import java.util.PriorityQueue;
import org.junit.Test;    

public class UnitTests {
private PriorityQueue<Node> closedPQ =  new PriorityQueue<Node>();
@Test
public void pqTest() {
    int N = 3, counter = 1;
    int[][] tiles = new int[N][N];

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            tiles[i][j] = counter++;
        }
    }
    tiles[2][2] = 0;
    tiles[1][1] = 6;
    tiles[1][2] = 5;

    Board initial = new Board(tiles);

    tiles[1][1] = 5;
    tiles[1][2] = 6;

    Board initial2 = new Board(tiles);

 System.out.println(initial.manhattan());
 System.out.println(initial2.manhattan());

 closedPQ.add(new Node(null, initial, 0));
 closedPQ.add(new Node(null, initial2, 0));

 Node n = closedPQ.remove();
 System.out.println(n.distance);
}
}

首先,你只需要制作一个新的电路板,然后更换一些nubers以获得不同的成本。我得到的错误是当我尝试将第二个节点添加到PQ时。任何人都知道如何解决这个问题?我希望在删除操作时将具有最小fost的节点返回给我。这是我添加到队列中的第二个节点,因为它的manhatten-score为0,而第一个节点的主板的manhatten-score为0。

我得到的失败追踪是:

java.lang.ClassCastException: gna.UnitTests$Node cannot be cast to   java.lang.Comparable
at java.util.PriorityQueue.siftUpComparable(Unknown Source)
at java.util.PriorityQueue.siftUp(Unknown Source)
at java.util.PriorityQueue.offer(Unknown Source)
at java.util.PriorityQueue.add(Unknown Source)
at gna.UnitTests.pqTest(UnitTests.java:100)

0 个答案:

没有答案