Diese Frage wirst Du hoffentlich selbst beantworten können: Wie gehst Du vor? Ich unterstelle einfach einmal, dass Du selbst es kannst.aber wie gehe ich weiter vor.
Du hast ein Array mit n Zahlen und musst sagen, welche Zahl am nächsten an 5 liegt?Hallo,
ich habe ein Array gegeben, wobei ich die Zahl zurückgeben will, die am nächsten zur Zahl 5 liegt. Wie kann ich dies umsetzen. Evtl. mit Math.abs ( 5- Zahl) aber wie gehe ich weiter vor.
Danke im Voraus.
wie würdest Du dann die gesuchte Zahl ermitteln?
Also ich gebe Dir einen Zettel, auf dem eine Zahlenreihe steht. Und ich will wissen, welche der Zahlen am nächsten an 5 ist. Kriegst Du das irgendwie hin?
"Wie würdest du das Problem mit Stift und Papier lösen. Ohne Computer. Ohne Java."
Bei sowas wirklich mit Stift und Papier sowas durchgehen.
Wie machst du das, wenn du es per Hand machen musst?
Danke bin aber Anfänger, was ist comparator.comparing..?Sehr interessant ist hierbei ja die programmtechnische Umsetzung. Die Mathematischen Grundlagen hast du ja schon. Es bringt also rein nichts, dich hinzusetzten und mit Stift und Papier irgendetwas hinzuschmieren...
Ein empfehlenswerter Ansatz wäre beispielsweise, sich eines zusätzlichen Arrays zu bedienen, in etwa so:
Java:public static int getIndex(final int[] a, final int nearestToVal) { int[][] temp = new int[a.length][3]; for (int i = 0; i < a.length; i++) { temp[i] = new int[]{i + 1, a[i], Math.abs(nearestToVal - a[i])}; } Arrays.sort(temp, Comparator.comparingInt(o -> o[2])); for (int i = 0; i < a.length; i++) { System.out.println("Index: " + i + ", origin Index: " + temp[i][0] + ", Val: " + temp[i][1] + ", Delta: " + temp[i][2]); } return temp[0][0] - 1; } public static void main(String[] args) { System.out.println(getIndex(new int[]{0, 3, 4, -4, 4, 6, 2, 1, 0}, 5)); }
Das Snippet sollte dir schon auf die Sprünge helfen.
Ganz im Gegenteil. Zumal es noch weniger bringt, einfach eine "Lösung" (die man noch nicht mal so nennen kann, die verwirrt ja sogar mich. Ist das wieder so eine ChatGPT Antwort? Wieso braucht man hierfür ein zweidimensionales Array? WTF?) hinzuklatschen.Es bringt also rein nichts, dich hinzusetzten und mit Stift und Papier irgendetwas hinzuschmieren...
Nein, das ist eine Antwort von Tobias. Daher bin ich mal gespannt, was da jetzt so als Reaktion kommen wirdIst das wieder so eine ChatGPT Antwort?
In Java kann man auch angebotene Lösungen zum Sortieren eines Arrays verwenden, z.B. ein Comparator Interface. Allerdings ist es auf Anfängerniveau erstmal sinnvoller solche Lösungen erst mit "Zettel und Stift" und dann "zu Fuss" zu implementieren.comparator
Nicht nur für Anfänger ist übrigens die beste Quelle die offiziele Dokumentation: Comparator.comparing()Danke bin aber Anfänger, was ist comparator.comparing..?
Also falls Du lernen willst, wie man so einfache Programme schreibt:Danke bin aber Anfänger, was ist comparator.comparing..?
Du hast da zu schnell getippt und Dich verschrieben .., Du wolltest schreiben, dass es von Dir keine brauchbaren Antworten gibt, weil Du zu dumm bist ...@elisa098 Du wirst hier keine brauchbaren Antworten erhalten, dafür sind die anderen zu dumm.
Vergiss das mit dem Comparator einen Moment lang. Das ist was für später.Danke bin aber Anfänger, was ist comparator.comparing..?
boolean z1Istkleiner = z1 < z2;
Ich finde es schön, zu sehen, dass Informatik (gerade am Anfang) einfach rein überhaupt nichts mit Programmieren bzw. Code (Java, oder welche Sprache auch immer) zu tun hat
Wo er recht hat, hat er rechtEdsger W. Dijkstra hat gesagt.:Computer Science is no more about computers than astronomy is about telescopes.
Du hattest doch schon als Aufgabe, das kleinste Element im Array zu finden, wenn ich mich recht erinnere. Das ist doch nichts anderes als die kleinste Differenz zu finden, mit dem Unterschied, dass man die Differenz halt vorher ausrechnen muss.Wie kann man denn die Zahlen vergleichen ob die Differenz kleiner ist
Nunja - wenn man "möglichst wenig Rechenoperationen" betrachtet, dann ist das aber eine schlechte Lösung. So ein beliebig zufälliges Array kommt, dann hast Du nur für die Sortierung eine Komplexität von O(n log(n)). Da ist ein einmaliges Durchlaufen (Komplexität O(n)) dann doch deutlich besser.Im Vorab kann eine Sortierung nach der Grösse durchaus Sinn machen, statt "stumpf" alle Möglichkeiten auszuprobieren (Anlehnung an Projekt Euler: dieses verlangt möglichst wenig Rechenoperationen).
int nearestAtFive = Arrays.stream(values)
.mapToObj(v -> v)
.sorted(Comparator.comparing(v -> Math.abs(5 - v)))
.findFirst().get();
public static void main(String[] args) {
int[] now = { 6, 2, 3, 7 };
System.out.println(nearFive(now));
}
public static int nearFive(int[] a) {
for (int i = 0; i < a.length; i++) {
int small = 0;
int dif = Math.abs(5 - a[i]);
int dif2 = Math.abs(5 - (a[i + 1]));
if (dif < dif2) {
small = a[i];
} else {
small = a[i + 1];
}
return small;
}
return a[0];
}
}
Ich glaube nicht, Tim. Du lieferst als Rückgabewert immer das erste Element im Array, fällt dir da nicht selbst auf, dass das nicht stimmen kann?Es funktioniert für 2 Werte im Array, wie bekomme ich es für alle Werte im Array hin?
Java:public static void main(String[] args) { int[] now = { 6, 2, 3, 7 }; System.out.println(nearFive(now)); } public static int nearFive(int[] a) { for (int i = 0; i < a.length; i++) { int small = 0; int dif = Math.abs(5 - a[i]); int dif2 = Math.abs(5 - (a[i + 1])); if (dif < dif2) { small = a[i]; } else { small = a[i + 1]; } return small; } return a[0]; } }
Hier könnte auch eine Warnmeldung wg. "dead code" erscheinen
warum ist das so?Hier könnte auch eine Warnmeldung wg. "dead code" erscheinen
Wenn Du Dir deinen Code anschaust, dann siehst Du in der Schleife ein return Befehl. Du gehst also in die Schleife rein und läufst nur ein einziges mal durch die Schleife durch.warum ist das so?
public static int findClosestToFive(int[] values) {
// Setze den ersten Wert des Arrays als den am nächsten an 5 liegenden Wert
int closest = values[0];
// Iteriere durch das Array und suche den am nächsten an 5 liegenden Wert
for (int value : values) {
if (Math.abs(value - 5) < Math.abs(closest - 5)) {
closest = value;
}
}
// Gib den am nächsten an 5 liegenden Wert zurück
return closest;
}
Mit welcher Entwicklungsumgebung arbeitest du? Ich führe Code im Debug-Modus durch, wenn er nicht funktioniert, und schaue bei jedem Schritt, ob die erwarteten Werte vorhanden sind. Wenn nicht, schaue ich spezifisch dort nach und versuche herauszufinden, ab wann es nicht mehr stimmt, d.h. ab welchen Schritt und wo im Code etwas nicht erwünschtes gemacht wird.Es funktioniert für 2 Werte im Array, wie bekomme ich es für alle Werte im Array hin?
Java:public static void main(String[] args) { int[] now = { 6, 2, 3, 7 }; System.out.println(nearFive(now)); } public static int nearFive(int[] a) { for (int i = 0; i < a.length; i++) { int small = 0; int dif = Math.abs(5 - a[i]); int dif2 = Math.abs(5 - (a[i + 1])); if (dif < dif2) { small = a[i]; } else { small = a[i + 1]; } return small; } return a[0]; } }
public static void main(String[] args) {
int[] now = { 7, 2, 3, 6 };
System.out.println(nearFive(now));
}
public static int nearFive(int[] a) {
int closest = a[0];
for (int i = 0; i < a.length; i++) {
if (Math.abs(i - 5) < Math.abs(closest - 5)) {
closest = i;
}
}
return closest;
}
}
Hab es ausprobiert mit a, es kommt aber eine Fehlermeldung. Wie genau kann ich die for each in eine for Schleife umwandeln?
for (int element : array) {
}
for (int index = 0; index < array.length; index++) {
var element = array[index];
}
Ist nicht böse gemeint aber solche Dinge lassen sich ganz leicht nachlesen.Danke, was bedeutet var?
var
ist ein Jave Schlüsselwort, wenn ich nicht irre, wurde es mit Java 10 eingeführt.var?
...ein "neueres" Schlüsselwort: https://javabeginners.de/Grundlagen/Datentypen/var.php
Sorry, aber in deinem ursprünglichen Code hast du doch bereits über den Index auf das Array zugegriffen.Hab es ausprobiert mit a, es kommt aber eine Fehlermeldung. Wie genau kann ich die for each in eine for Schleife umwandeln?
int dif = Math.abs(5 - a[i]);
Funktioniert wie ein Platzhalter. Falls der Datentyp hinter der Zuweisung vom Code her schon bestimmt werden kann, dann fügt der Compiler hier diesen Typen ein.Danke, was bedeutet var?
Das geht prinzipiell schon, da der Compiler (Interpreter/Transpiler/...) nur auf formelle Aspekte des Codes achtet. Wie dieser zustande kommt oder was (nicht) passieren soll, ist diesem dabei egal.ausprobiert ..trial and error
Alles klar, danke. Ich versuche die Tipps bei der nächsten Aufgabe anzuwenden.Funktioniert wie ein Platzhalter. Falls der Datentyp hinter der Zuweisung vom Code her schon bestimmt werden kann, dann fügt der Compiler hier diesen Typen ein.
Hätt ich eigentlich auch im for-each statement verwenden sollen anstatt int, so sind die beiden nicht absolut identisch.
Vorteil von var: Man kann Datentypen einfacher anpassen, weniger Schreibarbeit
Nachteil: Man muss wissen, was man tut
Ich kann meinen Vorrednern nur zustimmen. Vergiss das Ganze mal und schreib dir in einem Struktogramm auf, wie dein Algorithmus funktionieren soll - ohne auch nur eine einzige Zeile zu programmieren!. Auf die Frage "Wie würdest du das machen" hast du geantwortet "Ich suche das kleinste ...". Schon, aber WIE DENN? Wie entscheidest du auf dem Blatt, welche Zahl den kleinesten Abstand hat?
Dein Algorighmus weiter oben hat immer zwei aufeinanderfolgende verglichen. Würdest du das auf dem Blatt auch so machen? Immer nur zwei aufeinanderfolgende vergleichen? Was ist mit denen, die schon vorher da waren? Und warum vergleichst du überhaupt zwei aufeinanderfolgende? Du musst doch nur jedes einzelne mit einem bestimmten Element vergleichen. Nur ganz am Anfang handelt es sich dabei um zwei aufeinanderfolgende, danach nicht mehr.
Erst, wenn du eine Lösung hast, die auf dem Blatt funktioniert, fang an zu programmieren.
Und dann mach nicht alles auf einmal, sondern Schritt für Schritt die Teilaufgaben.