Berechnung der sleep time ist falsch

SonoHimitsu

Mitglied
Java:
		WebElement e0 = findTag(wd, "span", "id", "counter0");
		long t0 = getTime(e0);
		WebElement e2 = findTag(wd, "span", "id", "counter2");
		long t2 = getTime(e2);
		long st;
		if (t0 != -1 && t0 < t2) {
			System.out.println("Sleep until: "
					+ DateFormat.getDateTimeInstance().format(new Date(t0 + System.currentTimeMillis())));
			st = t0 + 2500;
		} else if (t2 != -1 && t2 < t0) {
			System.out.println("Sleep until: "
					+ DateFormat.getDateTimeInstance().format(new Date(t2 + System.currentTimeMillis())));
			st = t2 + 2500;
		} else {
			System.out.println("-- Sleep 1 hour");
			st = 60 * 60 * 1000;
		}
		System.out.println(st / 60000f);
		Thread.sleep(st);

Wenn es für einen der beiden Counter keinen Wert gibt (-1) dann nimmt er nicht automatisch den anderen Wert sondern schläft 60 Minuten. Was muss ich ändern?
 

LimDul

Top Contributor
Schau dir mal deine if Bedingungen genau an und überlege, wo er rein geht, wenn t2 = -1 ist und t0 ungleich -1.
Analog wenn t0=-1 ist und t2 ungleich -1.

Da läuft er jedes mal in den den letzten Zweig rein.
 

SonoHimitsu

Mitglied
Damit geht's
Java:
		long st = Stream.of(findTag(wd, "span", "id", "counter0"), findTag(wd, "span", "id", "counter2"))
				.map(Bot1::getTime).filter(Optional::isPresent).mapToLong(Optional::get).sorted().findFirst()
				.orElse((long) (60 * 60 * 1000));
		System.out.println(st / 60000f);
		Thread.sleep(st + 2500);

Aber etwas unschön ist das "+ 2500", das sollte bei "60 * 60 * 1000" eigentlich nicht geadded werden. Außerdem frage ich mich, ob dieser Aufwand bei zwei Elementen nötig wäre...
 
K

kneitzel

Gast
Also eine einfache If Abfrage bereitet so Probleme aber dann soll es eine Streaming Lösung sein? Und du hast genau zwei Werte - wie kommt man da überhaupt auf die Idee, Streams zu verwenden?

Und wenn an so eine Fragestellung heran gehst, und Dir die Aussagen von mrBrown und LimDul nicht liegen, dann geh einfach geradlinig heran und formuliere die Fälle, die es gibt, einzeln mit dem, was du Ausschließen willst:
1) beide Werte ungültig
2) erster Wert ungültig
3) zweiter Wert ungültig
4) kein Wert ungültig

Da kannst du jetzt Bedingungen formulieren (idealerweise mit Variablen mit aussagekräftigen Namen und vernünftigen Typen).

Und dann könntest Du noch optimieren. Ablauf ist aber so, dass Sonderfälle einfach am Anfang behandelt werden - dann muss man diese nicht ständig überall mitschleifen. (Was aber natürlich auch gehen würde! Du musst dann halt mit aufnehmen, dass der zweite Wert nicht -1 ist..)
 

mrBrown

Super-Moderator
Mitarbeiter
Naja, @mrBrown hat doch vorgeschlagen, Optional zu verwenden. Optionals machen nur mit Streams Sinn.
Optionals haben auch ohne Streams Sinn (ich würde sogar sagen, es gibt mehr sinnvolle Fälle ohne als mit Stream), in diesem Fall zwingen sie einen zu sinnvollen Bedingungen.


Auf Rückfragen hat dieser ach so tolle Moderator nicht reagiert.
Sorry, ich sollte wirklich drauf verzichten ein paar Stunden Freizeit zu haben. Um deine Frage zu beantworten. Nein, die Frage, was genau du ändern musst, kann ich, hätte ich aber nicht beantwortet. Hilfe zur Selbsthilfe gerne, fertigen Code aber nicht.
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Ja, das mit den Optionals wäre aus meiner Sicht auch gut, denn das würde den ‚Fehler‘ direkt zeigen. Denn du vergleichst im ersten if ggf einen Wert, der nicht da ist. t0 und t2 sind nicht gesetzt und du schaust, ob t0 value < t2 value ist. Bei Optionals bekommst Du eine NoSuchElementException.

Wobei ich durchaus ein Fan von eigenen Klassen bin und dann halt noch null Prüfungen mache. Da gäbe es bei sowas dann halt eine NPE...
 

LimDul

Top Contributor
Etwas widersprüchlich. Optionals mal ja mal nein. Streams mal ja mal nein... Könnte es sein, dass ihr keine Ahnung habt?
Es hapert eher an deinem Leseverständnis - wer sagt, denn das Optionals hier keinen Sinn machen? Optionals kann man verwenden - muss man aber nicht. Für Streams gab es keine Stimmen hier im Thread außer deiner.
 
K

kneitzel

Gast
Etwas widersprüchlich. Optionals mal ja mal nein. Streams mal ja mal nein... Könnte es sein, dass ihr keine Ahnung habt?
Irgendwie disqualifizierst du Dich total. Die ersten Antworten haben schon alles gesagt und du versuchst nicht einmal diese Antworten zu verstehen ... Du hast mehrere Hinweise bekommen. Hast Du es mal mit Optionals probiert? Soll ich Deine Lösung mal mit Optionals umschreiben, damit Du die Exception siehst und das dann evtl selbst lösen kannst?

Oder brauchst du einfach nur eine Abschreib Lösung, so wie du diese immer präsentierst? Nichts verstehen, aber man Code der erst mal zu machen scheint, was er soll?
 
K

kneitzel

Gast
Danke, das hat jetzt wirklich mein Wochenende versüßt. Informationen hast du genug bekommen, Verstehen musst du es selbst. Nachfragen kann man zur Not auch ... aber so lange keine konkreten Fragen bzgl. der Antworten kommen, gibt es keine neuen Ansätze.

Und nein: Deine Stream Lösung ist ein Witz.
 
K

kneitzel

Gast
Also das ist mit den ganzen Kommentaren doch total trivial. Einfache Umsetzung der Logik:

Wenn es nach meinem Ansatz gehen sollte:
Code:
if (t0 == -1 && t2 == -1) {  // zuerst wenn beides ungültig ist.
  System.out.println("-- Sleep 1 hour");
  st = 60 * 60 * 1000;
} else if (t2 == -1 || t0 < t2) { // T2 nicht gegeben oder t0 kleiner t2
  System.out.println("Sleep until: " + DateFormat.getDateTimeInstance().format(new Date(t0 + System.currentTimeMillis())));
  st = t0 + 2500;
} else {
  System.out.println("Sleep until: " + DateFormat.getDateTimeInstance().format(new Date(t2 + System.currentTimeMillis())));
  st = t2 + 2500;
}


Was mir noch einfällt als einfacher Ansatz, den Anfänger nutzen können: Einfach eine Tabelle aufstellen, die alle Fälle abdeckt und die man dann einfach 1;1 umsetzen kann:

t0 ; t2 ; Zu Nutzender Wert
-1 ;-1 ; 60 * 60 * 1000;
x ;-1 ; t0
-1 ; x ; t2
x ; x ; min(t0, t2) + 2500

mit
-1: "kein Wert"
x: gültiger Wert

Denn der Code von mir hat natürlich eine Optimierung, denn ich habe da etwas optimiert und in den 4. Fall aufgeteilt in das zweite if und das else.
 

mrBrown

Super-Moderator
Mitarbeiter
Wenn es nach meinem Ansatz gehen sollte:
Code:
if (t0 == -1 && t2 == -1) {  // zuerst wenn beides ungültig ist.
  System.out.println("-- Sleep 1 hour");
  st = 60 * 60 * 1000;
} else if (t2 == -1 || t0 < t2) { // T2 nicht gegeben oder t0 kleiner t2
  System.out.println("Sleep until: " + DateFormat.getDateTimeInstance().format(new Date(t0 + System.currentTimeMillis())));
  st = t0 + 2500;
} else {
  System.out.println("Sleep until: " + DateFormat.getDateTimeInstance().format(new Date(t2 + System.currentTimeMillis())));
  st = t2 + 2500;
}
t2 = 42 und t0 = -1?
 

mrBrown

Super-Moderator
Mitarbeiter
Etwas in diese Richtung könnte klappen:

Code:
if (t0.orElse(MAX_VALUE) < t2.orElse(MAX_VALUE)) {
  //t0
} else {
  //t2
}
 
K

kneitzel

Gast
t2 = 42 und t0 = -1?
Hmm, ist eben im Browser entstanden. Habe ich bei der schnellen Optimierung etwas übersehen. Das t0 != -1 muss in den Vergleich noch mit rein.

Also sowas:
Code:
} else if (t2 == -1 || (t0 != -1 && t0 < t2) ) {

Womit bewiesen ist: Ein dedizierter Typ, der eine Exception wirft, wenn man ohne Kontrolle auf den Wert zugreift, ist sinnvoll. Hier habe ich auf t0 zugegriffen, ohne geprüft zu haben, ob ein Wert vorhanden ist!

Danke!
 
K

kneitzel

Gast
Was auf jeden Fall klappt ist die Umsetzung der Tabelle:

Code:
if (t0 == -1 && t2 == -1) {
  // -1 ;-1 ; 60 * 60 * 1000;
  // ..
} else if (t0 != -1 && t2 == -1) {
  // x ;-1 ; t0
  // ...
} else if (t0 == -1 && t2 != -1) {
  //-1 ; x ; t2
  // ...
} else {
  //x ; x ; min(t0, t2) + 2500
  // ...
}

Also die einfache, geradelinige Lösung, die funktioniert ohne dass man Probleme hat.
 

SonoHimitsu

Mitglied
Ginge das auch so:
Java:
		WebElement e0 = findTag(wd, "span", "id", "counter0");
		long t0 = getTime(e0);
		WebElement e2 = findTag(wd, "span", "id", "counter2");
		long t2 = getTime(e2);
		long st;
		if (t0 != -1 && (t2 == -1 || t0 < t2)) {
			System.out.println("Sleep until: "
					+ DateFormat.getDateTimeInstance().format(new Date(t0 + System.currentTimeMillis())));
			st = t0 + 2500;
		} else if (t2 != -1 && (t0 == -1 || t2 < t0)) {
			System.out.println("Sleep until: "
					+ DateFormat.getDateTimeInstance().format(new Date(t2 + System.currentTimeMillis())));
			st = t2 + 2500;
		} else {
			System.out.println("-- Sleep 1 hour");
			st = 60 * 60 * 1000;
		}
		System.out.println(st / 60000f);
		Thread.sleep(st);
 
K

kneitzel

Gast
Probiere es einfach aus. Ich würde das noch etwas aufteilen, so dass:
- die magic Numbers verschwinden und für Tests zugreifbar sind.
- die Berechnung vom Sleep getrennt ist. (Sonst läuft der Unit-Test so lange)

Dann ist es ein einfacher Unit Test, der alle Fälle durchtestet.

=> Du hast die genaue Antwort, was geht und was ggf. nicht geht. Das ist generell ein Vorgehen, das ich Dir anraten würde. TDD muss es ja nicht unbedingt sofort sein, aber eine gewisse Abdeckung sollte man haben. Und bei einer Unsicherheit wie hier im Thread erkennbar ist ein vernünftiger Test unausweichlich und deutlich besser als ein einfaches Mal drüber schauen von Dritten.
(Und ohne Tests würde ich den Code als incomplete zurückweisen, sprich meine Antwort wäre ganz klar: Nein, so geht es nicht, es fehlen die Tests.)
 
K

kneitzel

Gast
Ja, aber wo ist das fachliches Wissen hin? Das Schulwossen des Informatikunterrichts fehlt doch hier total, wenn so if Abfragen diese Probleme hervorrufen?
 
K

kneitzel

Gast
ok, er ist es aber wohl - im Thread bezüglich seiner Accounts hat er ja auch nachgefragt ...
 
K

kneitzel

Gast
Wozu braucht man mehr wie einen Account in dem Forum? Das erschließt sich mir noch nicht wirklich. Wenn auf Grund des eigenem Verhaltens ein Account gesperrt wird oder so, dann überdenke ich mein Verhalten oder suche mir ein anderes Betätigungsfeld....
 

SonoHimitsu

Mitglied
Den Schreibstil zu ändern ist immer so aufwändig. :( Aber mir bleibt wohl nichts anderes übrig, als das zu tun, wenn man jedem anderen überlegen ist.
 
K

kneitzel

Gast
Den Schreibstil zu ändern ist immer so aufwändig. :( Aber mir bleibt wohl nichts anderes übrig, als das zu tun, wenn man jedem anderen überlegen ist.
Ja, Deine Überlegenheit hast Du hier im Thread ja gezeigt. Eine einfache if Abfrage bereitet Probleme und dann statt selbst kurz zu schauen, ob es funktioniert, ist dann die Rückfrage an uns....

Und sowas ist ja nicht zum ersten Mal ...

Aber ob du besser oder schlechter bist als wir steht hier überhaupt nicht zur Diskussion. An Deiner Selbsteinschätzung würde ich an Deiner Stelle etwas arbeiten. Das kann sonst in Teams problematisch sein.... Oder dem Kunden gegenüber ... aber muss man jetzt auch nicht glauben - mach ruhig Deine eigenen Erfahrungen ....
 

Meniskusschaden

Top Contributor
Wozu braucht man mehr wie einen Account in dem Forum? Das erschließt sich mir noch nicht wirklich.
Zum konkreten Fall kann ich natürlich nichts sagen, aber allgemein könnte ich mir vorstellen, dass es beispielsweise bei einem an dissoziativer Persönlichkeitsstörung erkrankten Patienten organisatorisch durchaus sinnvoll sein kann. Leidet er zusätzlich an psychologisch bedingter Hyperästhesie wäre es aus neuroethologischer Sicht bestimmt spannend, einen Flame-War des Patienten mit sich selbst zu beobachten.

@SonoHimitsu: Falls dich das auch interessiert, frag diesbezüglich doch mal bei @abc66 an. Ich glaube er hat sich zuletzt etwas mit neuronalen Netzen beschäftigt. Vielleicht weiß er darüber auch Bescheid. Aber bleib bitte höflich, er reagiert gelegentlich etwas sensibel. ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I File Uploader... Statusanzeige, Berechnung des Status etc. Java Basics - Anfänger-Themen 0
Bugs Bunny Fehlerhafte Berechnung beim erneuten Durchlaufen der Schleife Java Basics - Anfänger-Themen 5
Jamie logische Verknüpfung zur Schaltjahr-Berechnung Java Basics - Anfänger-Themen 30
Stephan_kl Reihenwert-Berechnung, Ergebnis mit vorherigem Ergebnis vergleichen Java Basics - Anfänger-Themen 11
Abraham42 Berechnung der Kühlung Java Java Basics - Anfänger-Themen 12
S Hashcode-Berechnung + ^ Java Basics - Anfänger-Themen 2
J Median-Berechnung von 2D-Teilarrays Java Basics - Anfänger-Themen 56
F Tabelle - Berechnung Rang Java Basics - Anfänger-Themen 2
B Berechnung der Position von Kinderelemente von einem Elternknoten Java Basics - Anfänger-Themen 23
S Switch-Case zur Berechnung der Einkommensteuer Java Basics - Anfänger-Themen 15
F Berechnung der Rektaszension und Deklination eines Sterns Java Basics - Anfänger-Themen 7
2 Taschenrechner mit GUI Problem bei der Berechnung Java Basics - Anfänger-Themen 8
V Erste Schritte Pi Berechnung Java Basics - Anfänger-Themen 47
M Berechnung der Reststrecke bei Graphen Java Basics - Anfänger-Themen 1
V Algorithmus zur fortlaufenden Berechnung des duechscjnt Java Basics - Anfänger-Themen 1
B Berechnung zu einer Schleife formen Java Basics - Anfänger-Themen 6
B Berechnung Median mit Methode Java Basics - Anfänger-Themen 7
CptK Methoden Berechnung von Anfangsgeschwindigkeit und Winkel Java Basics - Anfänger-Themen 27
K Erste Schritte Berechnung der Summe zweier Arrays Java Basics - Anfänger-Themen 15
S Erste Schritte Berechnung des Paketportos - Problem/Frage Java Basics - Anfänger-Themen 52
J Gleitkommazahlen, Berechnung von pi Java Basics - Anfänger-Themen 4
J Berechnung liefert falsches Ergebnis Java Basics - Anfänger-Themen 2
kilopack15 Verzweiflung wegen Berechnung mit Multithreading Java Basics - Anfänger-Themen 1
A Die Werte zur Berechnung müssen als Parameter übergeben werden? Java Basics - Anfänger-Themen 7
Salo Berechnung von Winkeln Java Basics - Anfänger-Themen 28
M Restbuchwert Berechnung geht nicht Java Basics - Anfänger-Themen 45
Ghostman1711 Pi berechnung Methode aufrufen Java Basics - Anfänger-Themen 2
L Rekursive Methode zur Berechnung der Potenz q hoch p Java Basics - Anfänger-Themen 17
beatles Operatoren Operatoren - Berechnung Java Basics - Anfänger-Themen 40
K Best Practice Algorithmus für Berechnung von Zahlenreihenfolge Java Basics - Anfänger-Themen 12
N Verzögerte Berechnung "Lazy" Java Basics - Anfänger-Themen 8
J Erste Schritte Rundungsproblem - Berechnung Notendurchschnitt Java Basics - Anfänger-Themen 13
S Variablen Vektor zur Berechnung verwenden Java Basics - Anfänger-Themen 4
T Java double berechnung fehler Java Basics - Anfänger-Themen 2
M Berechnung in Java Java Basics - Anfänger-Themen 4
S Berechnung der Arbeitstage in einem Zeitraum Java Basics - Anfänger-Themen 9
E Problem bei rekursiver Berechnung des Binomialkoeffizienten Java Basics - Anfänger-Themen 5
T Iterative Pi Berechnung in Rekursive Java Basics - Anfänger-Themen 2
S Double, int, Berechnung Java Basics - Anfänger-Themen 3
C Nach Berechnung runden und Wert ausgeben Java Basics - Anfänger-Themen 7
E Berechnung für Shop einbinden Java Basics - Anfänger-Themen 8
S Klassen Formel zur Berechnung .... Bitte um Hilfe Java Basics - Anfänger-Themen 7
S Euklid Algorithmus zur Berechnung des GGTs Java Basics - Anfänger-Themen 2
OnDemand Berechnung in die start und paint Methode eines Applets Java Basics - Anfänger-Themen 28
P Schleife zur Berechnung von einer Summe Java Basics - Anfänger-Themen 16
F Berechnung einer linearen Abschreibung Java Basics - Anfänger-Themen 5
E Berechnung von Punkten Java Basics - Anfänger-Themen 4
D Berechnung des Abstandes von zwei Punkten in einem Koordinatensystem Java Basics - Anfänger-Themen 14
A Methoden PI-Berechnung Java Basics - Anfänger-Themen 22
S Erste Schritte Berechnung mit Daten aus CSV und Date Objekt Java Basics - Anfänger-Themen 2
C Programm zur Berechnung der Spur einer Matrix Java Basics - Anfänger-Themen 4
P Pythagoras Baum - Berechnung der Punkte Java Basics - Anfänger-Themen 9
A Erste Schritte Steuer Berechnung, Alters Abhängig Java Basics - Anfänger-Themen 5
T Erste Schritte Berechnung von gerade und ungerade Zahlen Java Basics - Anfänger-Themen 10
J Erste Schritte Berechnung Ratten vermehrung Java Basics - Anfänger-Themen 4
P falsches ergebnis bei einfacher berechnung Java Basics - Anfänger-Themen 3
T Iterative Berechnung einer Satellitenbahn Java Basics - Anfänger-Themen 20
M Java Berechnung mit mehreren Lösungen? Java Basics - Anfänger-Themen 9
D Nullstellen-Berechnung Java Basics - Anfänger-Themen 10
L Fehlermeldung bei falscher Berechnung anzeigen Java Basics - Anfänger-Themen 31
A berechnung multiplikatives inverses Java Basics - Anfänger-Themen 5
J Berechnung des aktuellen Alters auf Basis des Geburtstags Java Basics - Anfänger-Themen 45
J Datentypen Fehler bei Berechnung mit Double und Int-Werten Java Basics - Anfänger-Themen 22
G Berechnung von Winkeln mit Cosinussatz Java Basics - Anfänger-Themen 2
B Arrays verwenden für Berechnung Java Basics - Anfänger-Themen 3
R Merkwürdige Modulo Berechnung Java Basics - Anfänger-Themen 7
B Hausaufgabe Berechnung quadratischer Funktion Java Basics - Anfänger-Themen 16
U Alter Berechnung + sortierung Java Basics - Anfänger-Themen 6
P Berechnung wird nicht durchgeführt Java Basics - Anfänger-Themen 2
D Berechnung von Ostern und Ramadan! Java Basics - Anfänger-Themen 24
N Algorithmus für Berechnung einer Quersumme Java Basics - Anfänger-Themen 9
D Berechnung von Geldausgabe Java Basics - Anfänger-Themen 22
F Berechnung von Kugeln! Java Basics - Anfänger-Themen 9
M rekursive Funktion zur Berechnung der Spiegelzahl Java Basics - Anfänger-Themen 7
S Hausaufgabe: Java-Programm schreiben zur Berechnung von x und y Java Basics - Anfänger-Themen 9
Y Ergebnis einer Berechnung an die Main Methode übergeben Java Basics - Anfänger-Themen 11
Semox Ersten Wert eines Intervalls bei Berechnung einschließen Java Basics - Anfänger-Themen 8
J Logarithmische Berechnung und Arrays Java Basics - Anfänger-Themen 2
B LinkedList - Berechnung des Produkts Java Basics - Anfänger-Themen 6
B Berechnung von Preisen per Java-Programm Java Basics - Anfänger-Themen 27
M Alters berechnung aus Geburtsjahr aus dem Buch Java Basics - Anfänger-Themen 5
O Fehler in der String-Distanz-Berechnung Java Basics - Anfänger-Themen 5
-horn- "Berechnung vorwärts, Optimierung rückwärts?" - Wie würdet ihr das machen? Java Basics - Anfänger-Themen 8
P iterative Berechnung Java Basics - Anfänger-Themen 9
1 Berechnung von PI mithilfe von Buffons Nadelproblem Java Basics - Anfänger-Themen 2
G Berechnung zwei Komplexen Zahlen Java Basics - Anfänger-Themen 34
N Rekursive Berechnung der Höhe eines binären Baumes Java Basics - Anfänger-Themen 4
J Programm für interaktive Berechnung von Temperaturverläufen Java Basics - Anfänger-Themen 9
K Annährende ganzzahlige Berechnung der Wurzel Java Basics - Anfänger-Themen 8
L Berechnung von Perioden Java Basics - Anfänger-Themen 4
D einfach berechnung einer onlinezeit Java Basics - Anfänger-Themen 25
S Euklid Klasse mit Methoden zur Berechnung des ggT Java Basics - Anfänger-Themen 23
G Frage zur Primzahlen berechnung Java Basics - Anfänger-Themen 11
G Berechnung von N-Tageslinien von Aktienkursen Java Basics - Anfänger-Themen 13
G Rekursive Berechnung von n über k schlägt fehl Java Basics - Anfänger-Themen 5
G Einfache Berechnung liefert falsches Ergebnis Java Basics - Anfänger-Themen 2
W Schaltjahr Berechnung Java Basics - Anfänger-Themen 24
A Probleme mit Programm zur Pi-Berechnung Java Basics - Anfänger-Themen 6
X Temperatur-Berechnung /Array(?) Java Basics - Anfänger-Themen 5
L Berechnung Summe Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben