compareTo() la méthode n'est pas primordial méthode par défaut lors de l'utilisation d'interface Comparable
Je suis en train de remplacer la valeur par défaut compareTo() la méthode en java, par l'écriture de mon propre et à l'aide de implémente comparable, cependant, il semble que java est encore à l'aide de la méthode par défaut.
Je suis en train de trier un tableau de Chaînes de caractères en fonction de la longueur que je l'obtenir à partir d'une .fichier dat, cependant, il continue à faire le tri par ordre alphabétique au lieu de cela. Je vous serais reconnaissant si quelqu'un pouvait me dire ce que je fais de mal que je ne peux pas comprendre pourquoi cela ne fonctionne pas.
Grâce
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);
}
}
Ici est la classe qui contient la méthode main
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);
}
}
OriginalL'auteur Special K | 2012-02-04
Vous devez vous connecter pour publier un commentaire.
Faites-vous une faveur: à chaque fois que vous remplacez une méthode, ajouter le
@Override
annotation. Cela vous donnera une erreur de compilation si vous faites une erreur dans la substitution de la méthode, qui est ce qui se passe ici. Vous sont la mise en œuvre de ce mal, commeComparable
(la "première" forme deComparable<T>
ne pas déclarer une méthodecompareTo(String)
, il déclare une méthodecompareTo(Object)
.Pour la compiler comme il est, vous devez accepter une
Object
au lieu d'unString
ou de mettre en œuvreComparable<String>
au lieu deComparable
.Mais ce serait vraiment être incorrecte dans la plupart des cas, parce qu'une telle comparaison n'est pas symétrique: vous pouvez comparer un Mot d'une Chaîne de caractères, mais pas une Chaîne de caractères dans un mot.
Plus probable que vous voulez mettre en œuvre
Comparable<Word>
au lieu deComparable
et accepter unWord
àcompareTo()
.Notez bien que l'
Comparable
est seulement une très bonne forme quand un type est intrinsèquement commandé (ce que les médecins appellent un "ordre naturel"), comme des dates ou des nombres. Puisque vous n'êtes pas réellement en comparant les deux mots par ordre alphabétique (ce qui serait le plus proche d'une Chaîne de l'ordre naturel) c'est un meilleur candidat pour l'utilisation d'une externe comparateur de.OriginalL'auteur Mark Peters
Comparable
est tapé, mais vous êtes à l'aide de la crue de type. Essayez ceci:sortByLength
méthode est le tri d'une liste de chaînes de caractères, et non une liste deWord
objets.J'ai fait ces changements et il compile très bien (comme avant), mais il est encore trier le tableau dans l'ordre alphabétique.
OriginalL'auteur Bohemian
Vérifier la signature de la méthode compareTo ici
Il devrait être
int compareTo(Object o)
et vous donner
public int compareTo(String rhs)
Vous pouvez également ajouter
@Override
annotation à votre méthode. Il vous permettra de savoir si vous ne suivez pas la bonne signature.compareTo
méthode dans une classe de mise en œuvreComparable<String>
est en effetpublic int compareTo(String rhs)
. Cela dit, la posté ce code met en œuvre bruteComparable
plutôt queComparable<String>
, ce qui est mal vu.OriginalL'auteur gprathour
La version courte: Vous devez utiliser le Les tableaux de.méthode de tri de prendre un Comparateur à la place.
La version longue: La ligne
dans le
sortByLength
méthode continue d'appeler lecompareTo
méthodes sur les objets qu'il est tri - et ces objets sont des chaînes de caractères! Au lieu de cela, vous avez besoin de la ligne deou vous pouvez créer une catégorie distincte de mise en œuvre
Comparator<String>
et utiliser une instance de ce que le deuxième argument deArrays.sort
.Pourquoi pas? C'est un exemple d'une classe anonyme, et vous pouvez trouver un exemple d'une classe anonyme au en.wikibooks.org/wiki/Java_Programming/...
Eh bien, j'ai essayé de copier ce que vous avez écrit à la place de la Tableaux.sort(array); et il m'a donné 43 erreurs.
OriginalL'auteur Adam Mihalcin