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;
}
}
}
Buch muss 'Vergleichbare' umzusetzen und seine eigene 'public int compareTo (Buch otherBook)' Methode haben für diese zu arbeiten. –
Danke für die Antwort! Sowohl Book als auch PlayingCard implementieren Vergleichbar und haben ihre eigenen compareTo-Methoden. –
Anstelle eines Absatzes, können Sie uns die tatsächliche Compiler-Ausgabe geben? –