2016-10-23 1 views
0

J'ai une affectation pour la classe dans laquelle nous devons trier un objet ArrayList < Object> contenant des objets Integer, Double, Book et PlayingCard. Nous devons utiliser le mot-clé 'instanceof' et la méthode 'compareTo' pour le tri. Je rencontre des problèmes avec ma méthode nommée "compare" qui prend deux éléments dans la liste et vérifie de quel type ils sont et si c'est le même type, utilise la méthode compareTo pour les trier. Les entiers et les doubles doivent être traités comme s'ils étaient triés ensemble, ce qui, je le sais, poserait des problèmes avec la méthode compareTo, puisqu'elle ne peut comparer que deux objets de même type. Je reçois toujours une erreur 'Can not find symbol' chaque fois que j'essaie d'appeler la méthode compareTo en utilisant les deux éléments qui sont passés (a.compareTo (b)). J'ai essayé de les convertir du type d'objet à leurs types de classe respectifs ... en vain. Je ne suis pas sûr de ce que je fais mal ici. Toute aide est grandement appréciée. Si vous avez besoin de voir le code des classes Book ou PlayingCard, je peux le fournir aussi. (Et oui, les deux Book et PlayingCard ont leurs propres méthodes compareTo et les deux implémentent comparables).Erreur "Impossible de trouver le symbole" dans la méthode de comparaison pour un programme de tri

Voici le code:

import java.util.ArrayList; 

public class Sorter { 
    /** 
    * Checks two objects in the list to see what type they are, 
    * if they are the same type, use compareTo method to sort, 
    * otherwise, sort in order of Integer and Double > Book > PlayingCard. 
    * 
    * @param a first object 
    * @param b second object 
    * @return a negative number if a < b, a positive number if a > b, 
    *   0 if a = b 
    */ 
    public static int compare(Object a, Object b) { 
     if ((a instanceof Integer || a instanceof Double) && (b instanceof Integer || b instanceof Double)) { 
      return a.compareTo(b); 
     } 
     else if ((a instanceof Integer || a instanceof Double) && (b instanceof Integer == false || b instanceof Double == false)) { 
      return -1; 
     } 
     else if ((a instanceof Integer == false || a instanceof Double == false) && (b instanceof Integer || b instanceof Double)) { 
      return 1; 
     } 
     else if ((a instanceof Book) && (b instanceof PlayingCard)) { 
      return -1; 
     } 
     else if ((a instanceof PlayingCard) && (b instanceof Book)) { 
      return 1; 
     } 
     else if ((a instanceof Book) && (b instanceof Book)) { 
     return a.compareTo(b); 
     } 
     else { 
     return a.compareTo(b); 
     } 
    } 

/** 
* Sort a list of objects. Uses the selection sort algorithm. 
* 
* @param stuff list of objects 
*/ 
public static void sort(ArrayList<Object> stuff) { 
    // selection sort 
    for (int i = 0; i < stuff.size() - 1; i++) { 
     int lowest = i; 
     for (int j = 1; j < stuff.size(); j++) { 
      if (compare(stuff.get(j), stuff.get(lowest)) < 0) { 
       lowest = j; 
      } 
     } 

     // swap to front 
     if (lowest != i) { 
      Object temp = stuff.get(i); 
      stuff.set(i, stuff.get(lowest)); 
      stuff.set(lowest, temp); 
     } 
    } 
} 

/** 
* Main method. Populates an arraylist of stuff and sorts it. 
* 
* @param args command-line arguments 
*/ 
public static void main(String[] args) { 
    ArrayList<Object> list = new ArrayList<>(); 

    list.add(8); 
    list.add(new PlayingCard(PlayingCard.HEARTS, PlayingCard.TWO)); 
    list.add(3.5); 
    list.add(new Book("Mark Twain", "The Adventures of Huckleberry Finn")); 
    list.add(new Book("F. Scott Fitzgerald", "The Great Gatsby")); 
    list.add(5.65); 
    list.add(new PlayingCard(PlayingCard.CLUBS, PlayingCard.SEVEN)); 
    list.add(new PlayingCard(PlayingCard.SPADES, PlayingCard.ACE)); 

    System.out.println("Original List: \n" + list); //debugging help 
    sort(list); 
    System.out.println("Sorted List: \n" + list); 
} 

}

Et voici l'erreur du compilateur:

Sorter.java:16: error: cannot find symbol 
        return a.compareTo(b); 
          ^
    symbol: method compareTo(Object) 
    location: variable a of type Object 
    Sorter.java:31: error: cannot find symbol 
        return a.compareTo(b); 
          ^
    symbol: method compareTo(Object) 
    location: variable a of type Object 
    Sorter.java:34: error: cannot find symbol 
        return a.compareTo(b); 
          ^
    symbol: method compareTo(Object) 
    location: variable a of type Object 
    3 errors 

méthode compareTo de carte à jouer:

public int compareTo(PlayingCard other) { 
     if (getSuit() < other.getSuit()) { 
      return -1; 
     } 
     else if (getSuit() > other.getSuit()) { 
      return 1; 
     } 
     else { 
      if (getRank() < other.getRank()) { 
       return -1; 
      } 
      else if (getRank() > other.getRank()) { 
       return 1; 
      } 
      else { 
       return 0; 
      } 
     } 
    } 

méthode de livre compareTo:

public int compareTo(Book other) { 
     if (getAuthor().compareTo(other.getAuthor()) < 0) { 
      return -1; 
     } 
     else if (getAuthor().compareTo(other.getAuthor()) > 0) { 
      return 1; 
     } 
     else { 
      if (getTitle().compareTo(other.getTitle()) < 0) { 
       return -1; 
      } 
      else if (getTitle().compareTo(other.getTitle()) > 0) { 
       return 1; 
      } 
      else { 
       return 0; 
      } 
     } 
    } 
+0

livre a besoin pour implémenter la méthode '' comparable et avoir son propre 'int compareTo publique (livre otherBook)' pour que cela fonctionne. –

+0

Merci pour la réponse! Les deux Book et PlayingCard implémentent Comparable et ont leurs propres méthodes compareTo. –

+0

Au lieu d'un paragraphe, pouvez-vous nous donner la sortie réelle du compilateur? –

Répondre

0

Vous appelez compareTo sur une instance de la classe Object. Si vous recherchez la classe Object (https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html), vous verrez que cette méthode n'existe pas. C'est ce que le compilateur vous dit, bien qu'il utilise le mot "symbole" pour représenter une méthode ou un champ. Avant d'appeler compareTo, vous devez convertir votre objet en une instance de Integer ou Double, comme le code suivant, puis vous pouvez utiliser la méthode compareTo de Integer ou la méthode compareTo de Double, en fonction de ce que vous avez. :

if(a instanceof Double && b instanceof Double) { 
    Double aDouble = (Double) a; 
    Double bDouble = (Double) b; 
    return aDouble.compareTo(b); 
} 

Très probablement dans ce cas, l'exercice vous demande de comparer Integer avec Double. Pour cela vous devez choisir quelle méthode compareTo vous pouvez utiliser, et si vous regardez dans les conversions et les représentations de int/double, alors celle que vous devez choisir est de Integer à Double, donc vous aurez besoin de quelque chose comme ça les options:

if(a instanceof Integer && b instanceof Double) { 
    Integer aInteger = (Integer) a; 
     Double bDouble = (Double) b; 
    return -bDouble.compareTo(aInteger.doubleValue()); //note the negative 
} 

et cela comme une autre option:

if(a instanceof Double && b instanceof Integer) { 
    Double aDouble = (Double) a; 
     Integer bInteger = (Integer) b; 
    return aDouble.compareTo(bInteger.doubleValue()); 
}