2017-08-13 3 views
1

J'ai du mal à compiler et je n'arrive pas à comprendre pourquoi. On dirait que je suis en train de chambouler quelque chose avec les classes imbriquées. Pour une raison quelconque, la classe ByManhattan n'a pas accès à Node? Si quelqu'un pouvait expliquer pourquoi c'est le message d'erreur et proposer une suggestion, cela serait utile. Merci.Classes de comparaison imbriquées imbriquées

public class Solver { 

    private class Node implements Comparable<Node>{ 
    private Board board; 
    private Node previous; 
    private int moves; 
    private int manhattan; 
    private int priority; 

    Node(Board b, Node p) { 
     board = b; 
     previous = p; 
     if (previous == null) 
      moves = 0; 
     else 
      moves = previous.moves + 1; 
     manhattan = board.manhattan(); 
     priority = moves + manhattan; 
    } 

    public int compareTo(Node that) { 
     return this.priority - that.priority; 
    } 

    // Why Doesn't this work??? 
    public Comparator<Node> manhattanOrder() { 
     Comparator<Node> m = new ByManhattan(); 
     return m; 
    } 

    private class ByManhattan implements Comparator<Node> { 
     public int compare(Node this, Node that) { // this is line 37 
      return this.manhattan- that.manhattan; 
     } 
    } 
    } 

MinPQ<Node> pq; 
ArrayList<Node> solution; 

// find a solution to the initial board (using the A* algorithm) 
public Solver(Board initial) { 
. 
. 
. 

L'erreur que je reçois est:

Solver.java:37: error: the receiver type does not match the enclosing class type 
public int compare(Node this, Node that) { 
       ^
required: Solver.Node.ByManhattan 
found: Solver.Node 
+2

'this' est un mot réservé. Mauvaise pratique pour nommer un paramètre après un mot réservé, vous devriez le nommer quelque chose de différent. Changez le premier paramètre pour 'int compare (Node, Node)' – shockawave123

+0

pas 100% mais essayez de rendre la classe de noeud statique. – shockawave123

+0

ahhh! Merci et désolé pour la question compliquée à une solution simple. Juste en changeant le "ceci" a fonctionné. La question peut-elle être supprimée? – Paul

Répondre

3

Renommer votre nom de paramètre:

public int compare(Node n1, Node n2) { // this is line 37 
     return n1.manhattan- n2.manhattan; 
    } 

Ne pas utiliser le mot réservé this pour les variables, qui est une erreur de compilation .

1

this est un mot réservé. C'est la source de votre erreur de compilation. C'est également une mauvaise pratique de nommer un paramètre/une variable après un mot réservé, vous devriez le nommer quelque chose de différent. Changer le premier paramètre pour int compare(Node,Node)