2016-10-23 3 views
0

Ich habe eine Zuordnung für die Klasse, in der wir eine ArrayList < Object> mit Integer, Double, Book und PlayingCard Objekte sortieren müssen. Wir müssen das Schlüsselwort 'instanceof' und die Methode 'compareTo' für die Sortierung verwenden. Ich habe Probleme mit meiner Methode namens "compare", die zwei Elemente in der Liste annimmt und prüft, um welchen Typ es sich handelt, und wenn sie vom selben Typ sind, verwendet sie die compareTo-Methode, um sie zu sortieren. Integer und Doubles sollten wie derselbe Typ behandelt werden, da sie zusammen sortiert werden, was, wie ich weiß, zu Problemen mit der compareTo-Methode führen würde, da sie nur zwei Objekte desselben Typs vergleichen kann. Immer wenn ich versuche, die compareTo-Methode mit den beiden übergebenen Elementen aufzurufen (a.compareTo (b)), erhalte ich immer den Fehler 'Kann nicht gefunden werden'. Ich habe versucht, sie vom Objekttyp in ihre jeweiligen Klassen umzuwandeln ... ohne Erfolg. Ich bin mir nicht sicher, was ich hier falsch mache. Jede Hilfe wird sehr geschätzt. Wenn Sie den Code der Buch- oder PlayingCard-Klassen sehen wollen, kann ich das auch liefern. (Und ja, sowohl Book als auch PlayingCard haben ihre eigenen compareTo-Methoden und beide implementieren Comparable).'Kann nicht Symbol' Fehler in Vergleichsmethode für ein Sortierprogramm

Hier ist der 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); 
} 

}

Und hier ist der Compiler-Fehler:

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 

Spielkarte des compareTo-Methode:

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; 
      } 
     } 
    } 

Buches compareTo-Methode:

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

Buch muss 'Vergleichbare ' umzusetzen und seine eigene 'public int compareTo (Buch otherBook)' Methode haben für diese zu arbeiten. –

+0

Danke für die Antwort! Sowohl Book als auch PlayingCard implementieren Vergleichbar und haben ihre eigenen compareTo-Methoden. –

+0

Anstelle eines Absatzes, können Sie uns die tatsächliche Compiler-Ausgabe geben? –

Antwort

0

Sie rufen compareTo für eine Instanz der Klasse Object auf. Wenn Sie das Klassenobjekt (https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html) nachschlagen, sehen Sie, dass es keine solche Methode gibt. Das sagt Ihnen der Compiler, obwohl er das Wort "symbol" verwendet, um eine Methode oder ein Feld darzustellen.

Bevor Sie compareTo aufrufen, müssen Sie Ihr Objekt wie im folgenden Code in eine Instanz von Integer oder Double umwandeln und dann je nach dem, was Sie haben, die compareTo-Methode von Integer oder die compareTo-Methode von Double verwenden :

Am wahrscheinlichsten in diesem Fall möchte die Übung, dass Sie Integer mit Double vergleichen. Dafür müssen Sie wählen, welche compareTo-Methode Sie verwenden können, und wenn Sie in Konvertierungen und die Darstellungen von int/double schauen, dann sollte die von Integer to Double gewählt werden, also benötigen Sie so etwas wie eines von die Optionen:

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

und dies als eine weitere Option:

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