Array, nächste Zahl zur 5 ausgeben, wie?

elisa098

Mitglied
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.
 
aber wie gehe ich weiter vor.
Diese Frage wirst Du hoffentlich selbst beantworten können: Wie gehst Du vor? Ich unterstelle einfach einmal, dass Du selbst es kannst.

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?

Konkretes Beispiel:
1, 17, 25, 3, 8, 10

Welche Zahl ist am nächsten an der 5 und wie bist du drauf gekommen?
 
Meta: 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, sondern erst einmal die Fähigkeit geschult werden muss, ein Problem zu beschreiben und für dessen Lösung eine Vorgehensweise bzw. "Algorithmus" formulieren zu können.
Das "Programmieren" kommt später.
Es freut mich ehrlich, dass aktuell die Default-Antwort im Java forum ist: "Wie würdest du das Problem mit Stift und Papier lösen. Ohne Computer. Ohne Java." und das auch zu recht.
 
Danke, man müsste doch schauen welche Differenz am kleinsten ist( 5- 1.Zahl des Arrays u. 5-2. Zahl des Arrays,…). Dabei müsste die Differenz im Betrag stehen, weil ja 4 u. 6 genauso nah an der 5 sind. Aber wie kann ich jede Differenz vergleichen u. im Endeffekt, die kleinste ausgeben. Komme nicht drauf wie man das im Code schreiben kann?
 
Bei sowas wirklich mit Stift und Papier sowas durchgehen. Du hast also die Zahlenfolge: 1, 17, 25, 3, 8, 10

Was genau machst Du? Du musst das wirklich durchspielen. Und schreibe dir Dinge, die Du merken willst auf!

Also zuerst nimmst Du die erste Zahl. Du rechnest Du 5-1 - das ist 4.
==> das ist dann bis hier her das nächste an der 5 - also merkst Du Dir: Die erste Zahl ist bisher am nächsten dran mit Abstand 4. (Das schreibst Du also auf einen Zettel:
Zahl, die bisher am nächsten dran ist: 1
Abstand der Zahl: 4

Dann nimmst Du dir die nächste Zahl. 17. Du rechnest 5-17 = -14, Du sagtest schon, dass Du nur den absoluten Wert haben willst, also 14.
Wie geht es da nun weiter? Was machst Du weiter?

Spiel es so im Detail durch! Kriegst Du das hin?
 
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.
Du hast ein Array mit n Zahlen und musst sagen, welche Zahl am nächsten an 5 liegt?

Wie machst du das, wenn du es per Hand machen musst? Genau gleich wirst du es im Code machen.

Tipp: Wie im echten Leben kann man sich merken, welche Zahl bis jetzt die tiefste Differenz hat (hier kannst du dir auch den Index merken oder wie groß die Differenz ist oder die Zahl selber oder alles miteinander).
 
Jetzt wird es aber leicht redundant, oder? 😉
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?
 
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.
Danke bin aber Anfänger, was ist comparator.comparing..?
 
Es bringt also rein nichts, dich hinzusetzten und mit Stift und Papier irgendetwas hinzuschmieren...
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.
Dein "Snippet" ist vermutlich die schlechtestmögliche Weise, wie man diese Aufgabe "lösen" kann (wenn es überhaupt eine Lösung ist).
 
Danke bin aber Anfänger, was ist comparator.comparing..?
Also falls Du lernen willst, wie man so einfache Programme schreibt:
Dann ignoriere diesen User - das ist unser Foren Spezi, der ständig gebannt wird und daher mit immer neuen Accounts um die Ecke kommt.

Das Vorgehen ist immer:
1. Verstehen des Algorithmus
2. Umsetzung
An diesen Schritten ist einfach nicht zu rütteln.

Daher: Wenn Du selbst in die Lage versetzt werden willst, so einfache Programme zu schreiben, dann spiel es durch. Den Anfang habe ich Dir doch schon gegeben in #6. (Und ich hatte da schon Angst, dass ich zu viel vorgegeben habe!)


Solltest Du das nicht lernen wollen, dann geh auf die Webseite von ChatGPT (Findest du per Google) und gib dieser KI die Aufgabe. Dann hast Du eine Lösung (und die wird um ein vielfaches besser sein als die vermeintliche Lösung von Tobias. (Tipp: Die Aufgabe so formulieren, dass klar ist, was Du brauchst, also sowas wie "Ich brauche ein Java Programm, welches bei einem gegebenen Array von int Werten mir den Wert gibt, der am nächsten an 5 ist.")

Du wirst absolut nichts lernen aber die Aufgabe ist erledigt. Wenn Du zu einer Prüfung musst (Arbeit in Schule, Klausur im Studium), dann sei Dir sicher, dass dies der beste Weg ist, um komplett durchzufallen. Das, was Du hier am Anfang lernen sollst sind absolute Grundlagen. Diese nicht zu verstehen ist fatal, da alles Weitere genau darauf aufbauen wird.
 
@elisa098 Du wirst hier keine brauchbaren Antworten erhalten, dafür sind die anderen zu dumm. 🙁
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 ...

Zumindest dümmer als eine KI, die
  • deutlich lesbaren Code schreibt
  • diesen erläutert

Aber das muss man nicht weiter diskutieren ... der kleine Tobias will aus dem Bällespieleparadies abgeholt werden ...
 
Danke bin aber Anfänger, was ist comparator.comparing..?
Vergiss das mit dem Comparator einen Moment lang. Das ist was für später.
Ein Comparator ist ein Interface, das 2 Werte vergleicht und ein vordefiniertes Ergebnis liefert.
Was du brauchst, ist ein simpler Vergleichs-Operator

Java:
boolean z1Istkleiner = z1 < z2;

Spiel aber bitte wirklich mal das Beispiel durch, das Konrad oben gepostet hat.
Errechne die Differenz für die erste Zahl, nimm an, dass das die kleinste Differenz ist. Merk dir diese Zahl.
Mach dir auf dem Zettel Notizen. Diese Notizen sind deine Variablen.
Dann geh zur nächsten. Berechne auch hier die Differenz. Vergleiche die beiden. Was nun?
Arbeite dich so Schritt für Schritt dann bis zur letzten Zahl vor. Hinweis: Du wirst nur einen Durchlauf brauchen (was dann einer einzelnen Schleife im Programm entspricht).
 
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).
Am Beispiel: "1, 17, 25, 3, 8, 10" --> sortieren --> "1,3,8,10,17,25" --> ("stumpfe Lösung"): betragsmässige Differenzen zur "5" errechnen --> "4,2,3,5,12,20" --> Minimum eines Arrays --> 2 --> "3" ist die gesuchte Zahl
Etwas eleganter: man könnte sich nur auf die Array-Elemente konzentrieren, die überhaupt in der Nähe der gesuchten Zahl liegen --> "1,3,8"
 
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).
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.

@elisa098 Das ist jetzt mal für Dich unteressant, was jetzt noch kommt. Das ist nichts, mit dem Du etwas anfangen solltest!

Aber ja, der Weg über eine Sortierung ist immer denkbar. Wenn ich es z.B. kurz in Streams machen müsste, dann wäre dies mein Weg:
Java:
        int nearestAtFive = Arrays.stream(values)
                .mapToObj(v -> v)
                .sorted(Comparator.comparing(v -> Math.abs(5 - v)))
                .findFirst().get();

Aber wenn ich es ohne Streams lösen wollte, dann wäre es definitiv nicht meine bevorzugte Wahl.
 
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];
    }
}
 
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];
    }
}
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?

Der Ansatz ist ganz falsch ... würdest du das so auf dem Papier machen?

Du vergleichst ja immer nur 2 Werte im Array und suchst von den beiden den kleineren. Ob du vorher schon was kleineres gefunden hast, interessiert dich in der Schleife nicht.

4 Änderungen
1. dif und small werden schon vor der Schleife initalisiert, mit den Werten aus a[0].
2. Die Schleife startet dann beim zweiten Element, also 1.
3. IN der Schleife wird nur noch dif2 berechnet. Ist dif2 < dif, dann wird dif auf dif2 gesetzt und small auf a [i ] Für den else Fall gibt es keine Änderung.

4. Der Rückgabewert ist dann natürlich nicht das erste Array Element, sondern small.

(und das ist jetzt der ganze vorgekaute Algorithmus. Wenn du dich wörtlich daran hältst, ist dein Programm fertig)
 
warum ist das so?
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.

Und bei Deinem Algorithmus machst Du auch noch nicht wirklich das, was notwendig wäre. Und ich finde es etwas enttäuschend, dass Du auf die Hilfestellungen nicht eingehst, die Du von mehreren Leuten bekommen hast. Wir wollten den Algorithmus mit Dir erarbeiten, aber du probierst statt dessen einfach nur mit Java Code herum, wie es scheint. Nur eben so funktioniert es nun einmal nicht (meiner Meinung nach). Da so immer weiter drauf ein zu gehen führt nur dazu, dass wir Dir nach und nach alle Teile geben, die du bräuchtest.

Aber um das einfach an der Stelle abzuschließen:
Java:
  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;
  }
 
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];
    }
}
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.

Ich gehe davon aus, dass du das nicht machst.
 
Ich will die for each Schleife noch in eine normale for Schleife umwandeln, jedoch scheint es dabei ein Problem zugeben, da hier bspw. nur noch 7 ausgegeben wird?


Code:
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?
Sorry, aber in deinem ursprünglichen Code hast du doch bereits über den Index auf das Array zugegriffen.
Java:
int dif = Math.abs(5 - a[i]);

So schnell kannst du das doch nicht vergessen haben, oder?

Wie @KonradN oben schon geschrieben hat, bekommt man den Eindruck, als ob du deinen Code per trial and error zurecht schusterst. So funktioniert Programmieren nicht. Man muss wissen, was die jeweiligen Befehle machen und nicht per Zufall das korrekte Ergebnis komponieren.
 
Danke, was bedeutet var?
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.
 
Zuletzt bearbeitet:
ausprobiert ..trial and error
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.

Aus menschlicher Sicht geht man aber davon aus, dass der Code (öfters) (an zentraler Stelle) geändert / erweitert /gepflegt/ ... wird. Von daher empfehlen sich "Teile-und-Herrsche"-Verhaltensweisen wie (z.B.) Codeformatierung, SOLID-Prinzipien, Test-Driven-Development (TDD), Architektur (z.B. UML), OOA, OOD, defensive Programmierung, Versionsverwaltung, "mit Leuten reden"...
 
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.
Alles klar, danke. Ich versuche die Tipps bei der nächsten Aufgabe anzuwenden.
 

Neue Themen


Zurück
Oben