Ausgabe
Ich habe eine Klasse OffbyOne
, in der ich eine Schnittstelle als Komparator deklariere, der aufgerufen wird, compare
wo ich zwei ganze Zahlen nehmen und True zurückgeben soll, wenn die Differenz zwischen zwei ganzen Zahlen 1 ist, und falsch, wenn nicht.
Hier mein bisheriger Code:
public static class OffbyOne {
public interface Compare {
int x;
int y;
if ((x-y) == 1) {
return true;
} else if ((y-x)==1) {
return true;
}
return false
public boolean equalChars(char x, char y); {
if (Compare(x,y) == true) {
return true;
}
return false;
}
Ich habe Mühe zu verstehen, wie Komparatoren in Java funktionieren und was ich tun muss. Wenn mir bitte jemand dabei helfen und dann erklären kann, wie es gemacht werden soll, wäre das großartig für mich.
Vielen Dank.
Lösung
Komparator existiert bereits in Java – java.util.Comparator
. Es ist etwas völlig anderes als das, was Sie beschreiben: Javas eigener Komparator ist ein Ding, dem Sie 2 Objekte geben, und der Komparator sagt Ihnen, welches der beiden bei einer Sortierung “früher kommt”. Ein solches Orakel ist alles, was Sie brauchen, um Dinge effizient zu sortieren.
Es ist erlaubt, aber keine gute Idee, Typen die gleichen wie Kern-Java-Typen zu benennen. Sie können Ihre eigene String
erstellen, die sich in jeder Hinsicht von der von Java unterscheidet String
(Ihre String
ersetzt in keiner Weise die Zeichenfolge von Java), es ist nur ein verwirrender Name, das ist alles. Du machst das gleiche mit Comparator
hier. Schlechte Idee. Ich würde es nennen OffByOne
oder ähnlich.
Deklarieren Sie eine Schnittstelle als Komparator namens Compare, wo ich zwei ganze Zahlen nehmen und True zurückgeben soll, wenn die Differenz zwischen zwei ganzen Zahlen 1 ist, und falsch, wenn nicht.
Das macht überhaupt keinen Sinn. Sie müssen die Aufgabe falsch verstanden haben. Eine Schnittstelle beschreibt das Was und nicht das Wie , während das, was Sie gerade gesagt haben, das Wie beschreibt. Das ist einfach nicht das, was Schnittstellen tun – sie können das Wie nicht definieren. Sie definieren nur das Was. Sie beschreiben eine Implementierung, keine Schnittstelle.
public interface Compare { int x; int y; if ((x-y) == 1) {
Sie können keinen Code in solche Typen stecken. Sie können dort nur Methoden, Felder, Konstruktoren und andere Typen einfügen. Sie können Code in eine Methode einfügen und dann die Methode in einen Typ einfügen, wenn Sie möchten. Da es sich um eine Schnittstelle handelt, können Sie Code überhaupt nicht in eine Schnittstelle stecken – Schnittstellen definieren, was eine class
tun kann, nicht wie sie es tut (es gibt den default
Mechanismus. Das ist definitiv nicht das, was diese Aufgabe von Ihnen verlangt). , trifft also hier nicht zu).
Dies wäre eine Schnittstelle:
public interface DifferenceOfOne<T> {
public boolean isDifferenceOfOne(T a, T B);
}
Dies besagt: Es gibt so etwas wie eine ‘DifferenceOfOne’-Implementierung für jeden gegebenen Typ. Eine solche Klasse würde die Methode implementieren isDifferenceOfOne
, die 2 Parameter annimmt, beide vom angegebenen Typ, und die dann einen booleschen Wert zurückgibt.
Sie können dann eine Implementierung für den Integer-Typ vornehmen:
class IntDiffOfOne implements DifferenceOfOne<Integer> {
public boolean isDifferenceOfOne(Integer a, Integer b) {
return (a - 1 == b || b - 1 == a);
}
}
DifferenceOfOne<Integer> intDiffOfOne = new IntDiffOfOne();
Oder in gebräuchlicherer, moderner Java-Syntax:
DifferenceOfOne<Integer> intDiffOfOne = (a, b) -> (a - 1 == b || b - 1 == a);
Und jemand anderes kann eine DiffOfOne-Implementierung schreiben, die Ihnen, ich weiß nicht, sagt, ob sich 2 LocalDate
Instanzen um genau 1 Tag unterscheiden, vielleicht wäre das eine DifferenceOfOne<LocalDate>
.
Wenn das alles für Sie verwirrend klingt – wenden Sie sich an denjenigen, der Ihnen diese Aufgabe gegeben hat, da entweder die Aufgabe keinen Sinn ergibt oder Sie sie falsch gehört/missverstanden haben.
Beantwortet von – rzwitserloot
Antwort geprüft von – Senaida (FixError Volunteer)