Comment faire pour initialiser correctement un Comparateur?
J'ai besoin d'écrire une méthode statique dans une classe MinTester qui calcule la "plus petite" chaîne
à partir d'une liste de tableaux de la collection à l'aide d'un comparateur objet:
public static String min(ArrayList<String> list, Comparator<String> comp)
Je ne peux pas utiliser les Collections de la classe pour calculer le minimum.
Voici ce que j'ai jusqu'à présent.
public class MinTester
{
public static String min(ArrayList<String> list, Comparator<String> comp)
{
String shortest = list.get(0);
for(String str : list) {
if ( comp.compare(str, shortest) < 0) {
shortest = str;
}
}
return shortest;
}
}
Je n'obtiens pas les erreurs de la méthode, j'ai Donc essayer de le tester dans la main avec cette.
Je reçois ce message d'erreur lorsque vous tentez de passer comp: Variable de comp peuvent ne pas avoir été initialisé
public static void main(String[] args)
{
//TODO code application logic here
MinTester s = new MinTester();
Comparator<String> comp;
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("ab");
list.add("abc");
list.add("abcd");
String a = s.min(list,comp);//Error: Variable comp may not have been initialized
System.out.println(a);
}
Heres où je rencontre mon problème.
J'essaie
Comparator<String> comp = new Comparator<>();//Error:Comparator is abstract, cannot be instantiated
Comparator<String> comp = new MinTester();//Error: MinTester cannot be converted to Comparator<String>
Quelqu'un peut me dire la bonne façon de gérer cette Comparaison? Je ne sais pas si Im juste essayer d'initialiser de manière incorrecte, ou si il me manque quelque chose dans mon MinTester classe.
Vous n'avez pas défini ce que tu veux dire par "plus petit". Vous impliquer dans votre code que vous voulez dire "le plus court", mais je soupçonne que la définition est un peu plus complexe, comme dans "le plus court, mais en cas d'égalité des voix, le tri en fonction du caractère d'ordre de classement (c'est à dire par ordre alphabétique pour les lettres)". Une fois que vous savez que, mettre en œuvre
Comparator<String>
.
OriginalL'auteur Reeggiie | 2014-03-02
Vous devez vous connecter pour publier un commentaire.
Vous devez écrire une classe qui implémente
Comparator<String>
pour cela. Une approche rapide à l'aide de la classe anonyme:Car vous avez besoin de comparer basé sur la longueur de la Chaîne, il suffit de changer la logique de comparaison dans le
compare
méthode:Si vous arrive d'utiliser Java 7, puis utilisez
Integer#compare
:Si vous utilisez Java 8, vous pouvez utiliser une expression lambda:
Comparator
est une interface. Il doit être "mise en œuvre" n'est pas étendue.droit, il fixe.
J'ai essayé cela, et ma sortie pour un semble être fondée par l'ordre alphabétique, de ne pas comparer des longueurs. Si j'ai des " b " et "abc", un = abc parce que a vient avant b. Je voudrais l'essayer et de le modifier, mais je ne suis pas sûr de savoir comment cette méthode anonyme va main dans la main avec la méthode de ma classe MinTester
Puis remplacer le corps de la méthode de comparaison par le code qui compare la longueur des chaînes. Ne doit pas être plus longue que la 1 ligne.
Vous avez juste à remplacer exactement la même ligne où vous avez
String a = s.min(list, comp);
par celui-ci. Si vous avez besoin de comparer par la longueur de la Chaîne, puis modifiez la mise en œuvre.OriginalL'auteur Luiggi Mendoza
Comparator
est une interface; les différentes classes de la mettre en oeuvre dans les différentes façons d'effectuer différents types de comparaisons. La raison pourquoi votre méthode prend unComparator
est donc que l'appelant peut choisir la façon dont les chaînes de caractères doivent être comparés. Passer dans unComparator
qui ne lexicale (aka alphabétique), de la comparaison, et vous obtiendrez la première chaîne dans l'ordre lexical. Passer dans unComparator
qui ressemble à la longueur de la chaîne, et vous obtiendrez la plus courte chaîne.Depuis le
String
classe implémente déjà leComparable
interface — une sorte de frère de l'Comparator
qui permet à une classe de définir sa propre méthode de comparaison — voici une pratique de classe générique qui vous permet d'utiliser touteComparable
par le biais de laComparator
interface:Passer un de ces dans votre méthode, et il va comparer les chaînes de caractères à l'aide de la
String
classecompareTo
méthode.Edit: Dans Java 8 ou version ultérieure, le
Comparateur.naturalOrder()
méthode vous donne la même chose, de sorte que vous n'avez pas besoin d'écrire la classe au-dessus.OriginalL'auteur Wyzard
Vous n'avez pas besoin d'utiliser
Comparator
, au moins pas, sauf si vous souhaitez modifier l'ordre naturel des comparaisons de chaînes. Utiliser lecompareTo()
méthode pour laString
classe à la place.Si vous souhaitez modifier l'ordre naturel, vous pouvez créer une classe qui implémente l'
Comparator
interface puis de passer une instance de cette classe à lacompare()
méthode. Vous pouvez également définir votre propre logique pour les comparaisons.Ensuite, vous pouvez utiliser une instance de la classe ci-dessus afin de comparer les dans l'ordre décroissant, tels que:
"b" < "a"
Comparator
est une exigence. (Cela sonne comme une école d'affectation).C'est correct
Ohh! Ensuite, vous pouvez utiliser le
Comparator
classe dans ma réponse à l'instruction de retour commereturn str1.compareTo(str2);
de préserver l'ordre naturelOriginalL'auteur Kedarnath Calangutkar