in einem Array den nächstgelegenen Wert zu einem eingabewert finden

berninator97

Mitglied
hallo zusammen,
ich möchte ein Programm schreiben, das einen double wert von der Konsole entgegennimmt und anschließend in einem Array den Wert findet, der der Eingabe am nächsten liegt.
Konkret: Ich habe ein Array mit 32 Stellen, in dem Zahlen zwischen 0 und 348,75 in einem Abstand von jeweils 11,25 gespeichert sind. Wenn ich jetzt zum Beispiel den Wert 281,25 eingebe, finde ich diesen Wert mit Array.binarySearch problemlos. Mein Ziel ist es aber, einen Wert wie 240 einzugeben und (weils der nächstgelegene Wert ist) den Indexwert von 236,25 zurück zu bekommen und von da aus weiter zu machen.
P.S.: Da ich mich noch nicht sooo lange mit Arrays beschäftige, ist meine Beschreibung wahrscheinlich nicht so präzise wie ich es gerne hätte. Aber ich hoffe, mein Problem ist trotzdem irgendwie verständlich.
 
Zuletzt bearbeitet:
Die erste Möglichkeit, die mir gerade einfällt, ist, zum Beispiel mit einer For-Schleife durch das Array durchzugehen, die Differenz zum eingegebenen Wert zu vergleichen und sich den Index immer zu merken, wenn er kleiner geworden ist. Falls das Array sortiert ist, kannst du die Schleife dann auch unterbrechen, sobald die Differenz wieder größer wird.

Aber was genau ist denn dein Ziel? Für mich klingt das gerade so, als wäre das Problem mit einer einfachen Rechnung leichter zu lösen, als mit einem Array. 🙂
 
Das Array ist nach meiner Meinung nicht notwendig.

Ich würde den eingegebenen Wert durch den Abstand 11,25 dividieren und dann runden.

Das ergibt den Index.

Diesen mit 11,25 multiplizieren.

Für Werte ausserhalb des Bereiches muss dann noch extra was codiert werden.
 
@berninator97 Ich habe eine Vermutung... meinst du das so?

Java:
import java.util.List;
import java.util.NoSuchElementException;

public class BinSerTest {
    public static int contains(double[] list, double x, double delta) {
        if (list == null || list.length == 0) {
            throw new NoSuchElementException("");
        }
        int i = 0;
        int j = list.length / 2;
        int k = list.length - 1;
        while (true) {
            System.out.println(i + " " + j + " " + k);
            if (x + delta < list[i]) {
                return -1;
            }
            if (Math.abs(x - list[i]) <= delta) {
                return i;
            }
            if (Math.abs(x - list[j]) <= delta) {
                return j;
            }
            if (Math.abs(x - list[k]) <= delta) {
                return k;
            }
            if (x < list[j]) {
                k = j;
                j = (i + j) / 2;
                if (j == k) {
                    return -1;
                }
            } else if (x < list[k]) {
                i = j;
                j = (j + k) / 2;
                if (i == j) {
                    return -1;
                }
            } else {
                return -1;
            }
        }
    }

    public static void main(String[] args) {
        List<Double> list = List.of(5., 6., 7., 8., 9., 10., 11.);
        System.out.println(contains(list.stream().mapToDouble(Double::doubleValue).toArray(), 10, 0));
        System.out.println(contains(list.stream().mapToDouble(Double::doubleValue).toArray(), 8.5, .5));

        List<Double> list1 = List.of(5., 5.1);
        System.out.println(contains(list1.stream().mapToDouble(Double::doubleValue).toArray(), 4, .1));
        System.out.println(contains(list1.stream().mapToDouble(Double::doubleValue).toArray(), 5, .1));
        System.out.println(contains(list1.stream().mapToDouble(Double::doubleValue).toArray(), 6, .1));
    }
}
 
Für den Fall von gleichen Abständen hat @Meniskusschaden ja schon eine Lösung genannt, für nicht gleichbleibende Abstände kannst du binarySearch auch nutzen wenn der Wert nicht enthalten ist. Der negative Wert gibt den Index an, an der der Wert im Array eingefügt werden müsste – der Wert, der am nächsten dran ist, ist dann der danach oder davor (musst dabei nur ein bisschen mit den Indizes spielen).
 
Hallo und überhaupt erstmal vielen Dank für die schnellen Reaktionen. Ich dachte, ich warte ein paar Tage bis ich eine Antwort bekomme, auf eine solche Resonanz war ich aber nicht vorbereitet😄

Wenn es sowieso gleichbleibende Abstände sind, musst du gar nicht suchen, sondern kannst den Index auch direkt berechnen:
(int) Math.round(240.0 / 11.25)
Das sieht man mal wieder, dass ich bei solchen Gelegenheiten viel zu kompliziert denke😂. Nochmal vielen Dank für die Hilfe 🙂
 

Neue Themen


Zurück
Oben