compareTo () - Methode nicht überschreiben des Standard-Methode bei der Verwendung von Vergleichbaren Schnittstelle
Ich versuche zu überschreiben, die standardmäßig compareTo () - Methode in java schreiben, meine eigene und mit implements vergleichbar, aber es scheint, dass java immer noch mit der Standard-Methode.
Ich versuche, mich zu Sortieren Sie ein array von Zeichenfolgen, die von der Länge, die ich bekommen aus einer .dat-Datei, aber es hält Sie Sortieren in alphabetischer Reihenfolge statt. Ich würde es schätzen, wenn jemand mir sagen könnte was ich falsch mache, da ich nicht herausfinden, warum dies nicht funktioniert.
Dank
import static java.lang.System.*;
import java.util.Arrays;
public class Word implements Comparable
{
private String word;
private String[] array;
public Word()
{
word = "";
}
public Word(String s)
{
word = s;
}
public void setWord(String s)
{
word = s;
}
public int compareTo(String rhs)
{
String temp = (String)rhs;
if(word.length() > temp.length())
return 1;
else if(word.length() < temp.length())
return -1;
return 0;
}
public void setSize(int size)
{
array = new String[size];
}
public void add(int spot, String other)
{
array[spot] = other;
}
public String[] sortByLength()
{
Arrays.sort(array);
return array;
}
public String toString()
{
return Arrays.toString(array);
}
}
Hier ist die Klasse, die die main-Methode
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
import java.util.Arrays;
import static java.lang.System.*;
public class Lab18d
{
public static void main( String args[] ) throws IOException
{
Scanner file = new Scanner(new File("lab18d.dat"));
int size = file.nextInt();
file.nextLine();
Word test = new Word();
test.setSize(size);
String word = "";
for(int i = 0; i < size; i++)
{
word = file.next();
test.setWord(word);
test.add(i, word);
}
test.sortByLength();
System.out.println(test);
}
}
InformationsquelleAutor Special K | 2012-02-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Tun Sie sich einen gefallen: jedes mal, wenn Sie eine Methode überschreiben, fügen Sie den
@Override
annotation. Dadurch erhalten Sie einen Kompilierungsfehler, wenn Sie einen Fehler bei überschreiben der Methode, die ist, was hier geschieht. Sie sind Umsetzung es falsch, wieComparable
(die "rohe" form derComparable<T>
nicht deklarieren Sie eine MethodecompareTo(String)
es deklariert eine MethodecompareTo(Object)
.Um es zu kompilieren, wie es ist, würden Sie brauchen, um zu akzeptieren ein
Object
statt einerString
oder implementierenComparable<String>
stattComparable
.Aber das wäre wirklich falsch, in den meisten Fällen, da ein solcher Vergleich ist nicht symmetrisch: Sie können vergleichen, ein Wort in einen String, aber nicht ein String zu einem word.
Wahrscheinlich, die Sie umsetzen wollen
Comparable<Word>
stattComparable
und akzeptierenWord
zucompareTo()
.Beachten Sie aber, dass
Comparable
ist nur eine wirklich gute Passform, wenn ein Typ intrinsisch bestellt (was die docs nennen es eine "Natürliche Ordnung"), wie Datumsangaben oder zahlen. Da Sie nicht wirklich vergleichen die beiden Wörter in alphabetischer Reihenfolge (das wäre die am nächsten zu einem String s Natürliche Ordnung) dies ist ein besserer Kandidat für eine externen Komparator.InformationsquelleAutor Mark Peters
Vergleichbar
eingegeben, aber Sie sind mit der raw-Typ. Versuchen Sie dies:sortByLength
Methode sortiert eine Liste von Zeichenketten, nicht eine Liste vonWord
Objekte.Ich machte die änderungen und es kompiliert einwandfrei (wie vorher auch), aber es ist immer noch Sortieren, array alphabetisch.
InformationsquelleAutor Bohemian
Überprüfen Sie die Signatur der compareTo-Methode hier
Sollte es
int compareTo(Object o)
und geben Sie
public int compareTo(String rhs)
Können Sie auch hinzufügen
@Override
Anmerkung zur Methode. Es wird Sie wissen lassen, wenn Sie nicht nach der richtigen Signatur.compareTo
Methode in einer Klasse dieComparable<String>
ist in der Tatpublic int compareTo(String rhs)
. Das heißt, die geposteten code implementiert rawComparable
eher alsComparable<String>
, das ist verpönt.InformationsquelleAutor gprathour
Die kurze version: Sie müssen die Arrays.sort-Methode, wobei ein Komparator statt.
Die lange version: Die Linie
in der
sortByLength
Methode hält den Aufruf dercompareTo
Methoden auf die Objekte, die es zu Sortieren - und die Objekte sind Zeichenketten! Stattdessen müssen Sie die Zeileoder erstellen Sie eine eigene Klasse implementieren
Comparator<String>
und verwenden Sie eine Instanz, die als zweites argument anArrays.sort
.Warum nicht? Es ist ein Beispiel für eine anonyme Klasse, und Sie finden ein Beispiel für eine anonyme Klasse in en.wikibooks.org/wiki/Java_Programming/...
Gut, ich habe versucht zu kopieren, was Sie schrieb an Stelle des Arrays.sort(array); und es gab mir 43 Fehler.
InformationsquelleAutor Adam Mihalcin