Liste von Integer -> Nächster Wert bekommen

beta20

Top Contributor
Hallo,

ich habe eine Liste von Integer
  • List<Integer> list = new ArrayList<Integer>();
  • Es können nur Zahlen von 0 - 6 drinstehen
  • Es kann z.B. 3 und 5 (also zwei Einträge in der Liste drin stehen)
    • list.add(3)
    • list.add(5)
Nun habe ich eine weitere Zahl als reinen int:
int myNumber = 4

Nun möchte ich die nächstgelegene Zahl aus der Liste bekommen.
Also in diesem Beispiel die 5 (aus list)
Habe ich nun aber als myNumber = 6 -> dann möchte ich die 3 aus der Liste.

Wie kann ich das machen?
Danke für jede Hilfe
 
Habe ich nun aber als myNumber = 6 -> dann möchte ich die 3 aus der Liste.
Warum ist denn die 6 am nächsten zur 3?

Prinzipiell könntest du für jeden Wert in der Liste die absolute Differenz errechnen.
Die Zahl mit der geringsten Differenz ist dann deine Zahl, die am nächsten an der gesuchten Zahl dran liegt. Diese musst du dir während des "Vorgangs" merken und ggf. ersetzen, falls du eine Zahl gefunden hast, die eine kleinere Differenz hat.
 
Um hier niemand zu verwirren, habe ich es abstrakt gehalten.
Es geht hier aber um Wochentage. 0-6
0 = Montag.... 6 = Sonntag

6 = Sonntag
-> Nächster Tag = 3 (Donnerstag)

Dein Ansatz klingt schon Mal ganz logisch....
Wie kann ich das am Besten machen? Gibt es hierfür Methoden bereits?
 
Der Ansatz wird so für dein Vorhaben aber nicht funktionieren. (Zumindest auf den ersten Blick) Bei der Konstellation {3,5} und der Zahl 6 würde so immer die 5 als nähste Zahl raus kommen. Wenn ich dich richtig verstanden habe willst du aber die 3 bekommen.
 
Korrekt, ich möchte den nächste Wochentag von meinem "Template" haben.

Template:
  • list.add(1) -> also Dienstag
  • list.add(3) -> also Donnerstag
  • list.add(5) -> also Samstag
Der letzte erfolgreiche "Run" war am Dienstag (diese Info hole ich mir aus einer Tabelle)
-> also will ich ein neues Objekt für Donnerstag (nächster Wochentag in der Liste) erzeugen.

Beim Samstag soll es dann aber wieder zu list.add(1) -> also der Dienstag....
 
Also ich würde das einfach anders lösen, ein wenig objektorientierter
Java:
class WeekDaySet {
  private NavigableSet<Integer> days;
  
  public WeekDaySet() {
    this.days = new TreeSet<>();
  }
  
  public void add(int weekDay) {
    checkWeekDayRange(weekDay);
    days.add(weekDay);
  }
  
  public int getNext(int weekDay) {
    checkWeekDayRange(weekDay);
    if (days.isEmpty()) {
      throw new NoSuchElementException("No valid day set");
    }
    return Objects.requireNonNullElseGet(days.higher(weekDay), () -> days.ceiling(0));
  }
  
  private void checkWeekDayRange(int weekDay) {
    if (weekDay < 0 || 6 < weekDay) {
      throw new IllegalArgumentException("WeekDaySet can only be in range [0, 6]");
    }
  }
}
Dann mit sowas asführen:
Java:
WeekDaySet set = new WeekDaySet();
set.add(3);
set.add(5);
System.out.println(set.getNext(4));
System.out.println(set.getNext(6));
 

Zurück
Oben