hey leute ,kann jemand mir bei meine Aufgabe helfen ?
(Wir simulieren die Filterung von Sensor-Daten mit einem einfachen Mittelwert-Filter. Angenommen, wir haben einen Sensor, der Messdaten von einem Prozess empf¨angt. Wir wollen einen gleitenden Mittelwert uber 3 Beispiele berechnen. Wenn besonders ¨ extreme Werte auftreten, soll die Filterung beendet werden und ein Alarm ausgel¨ost werden. Der Sensor wird durch einen gegebenen Zufahlszahlengenerator simuliert)
Implementieren Sie die Filter-Funktion, welche solange durch den Aufruf von nextSample ein neue Daten akquiriert und filtert, bis der Sensor-Wert gr¨oßer als 3.14 ist.
Zu deinem Code:
- Wieso zählt deine for-Schleife bis 10. statt bis 10?
- Wo kommen die Parameter a,b und c deiner filter-Methode her?
- Die meisten Variablen hast du in der main-Methode deklariert anstatt in der filter-Methode
Streams sind dafür relativ umständlich, da man ein Fenster über drei Werte braucht, die einfachere Lösung ist da so eine Schleife. Oder schwebt dir da schon eine konkrete Implementierung vor?
staticvoidfilter(){
java.util.stream.DoubleStream.iterate(SensorData.nextSample(), d -> d <=3.14, d ->SensorData.nextSample()).map(new java.util.function.DoubleUnaryOperator(){double[] s =newdouble[3];publicdoubleapplyAsDouble(double v){System.arraycopy(s,0, s,1,2);return((s[0]= v)+ s[1]+ s[2])/3;}}).forEach(System.out::println);}
allerdings ist das natürlich eher "naja", weil es ein stateful Stream ist, da die map() Operation einen Zustand hat.
(das Array nehme ich nur, um ein paar explizite Zuweisungen zu sparen und das "Shiften" der Werte per arraycopy() zu lösen)
Streams sind dafür relativ umständlich, da man ein Fenster über drei Werte braucht, die einfachere Lösung ist da so eine Schleife. Oder schwebt dir da schon eine konkrete Implementierung vor?
Ich hab den TS eher so verstanden, daß er drei Werte verarbeiten soll. Das ist nicht dasselbe, wie auf drei Werte zu begrenzen (so verstehe ich das mit der Schleife jedenfalls).
Eine konkrete Implementierung hab ich da nicht, ich habe mal ein Javaprogramm geschrieben das über eine serielle Schnittstelle kommunizieren sollte. Da hab ich einen "Kurzschlußstream" (eigentlich zwei Streams, wobei der eine wieder ausgibt was in den anderen reingeht) geschrieben, zum Testen und um die Hardware zu simulieren.
Als sehr aufwendig habe ich das aber jedenfalls nicht in Erinnerung. Andererseits - wenn du den Zwölfzeiler von @httpdigest aufwendig findest...
Aufwändig nicht, aber zumindest etwas umständlich, auch weil man da etwas gegen die Spezifikation verstoßen muss — die fordert für map eine stateless function, hier braucht man aber eine stateful function. Klappt in dem Fall zwar trotzdem, aber ist nicht schön
Zu deinem Code:
- Wieso zählt deine for-Schleife bis 10. statt bis 10?
- Wo kommen die Parameter a,b und c deiner filter-Methode her?
- Die meisten Variablen hast du in der main-Methode deklariert anstatt in der filter-Methode
Ich bin neu und habe dir gleiche Aufgabe erhalten. Könnte mir einer bitte erklären, wieso man überhaupt hinter eine Zahl ein Punkt setzt, also was das bewirkt. Also 10. zb…?
Danke im Voraus fürs aufklären😊
Der Punkt macht aus dem Literal ein double. 3 ist also ein int, während 3. ein double-Literal ist.
Ist in diesem konkreten Fall aber unnötig, da s_t0, s_t1 und s_t2 sowieso double sind.
Aber es ist manchmal hilfreich, um eine ungewollte Ganzzahldivision zu verhindern.
Oder, wie in diesem Fall, um zu verdeutlichen, welche Typen die Operanden (also Zähle _und_ Nenner haben).
Der Punkt macht aus dem Literal ein double. 3 ist also ein int, während 3. ein double-Literal ist.
Ist in diesem konkreten Fall aber unnötig, da s_t0, s_t1 und s_t2 sowieso double sind.
Aber es ist manchmal hilfreich, um eine ungewollte Ganzzahldivision zu verhindern.
Oder, wie in diesem Fall, um zu verdeutlichen, welche Typen die Operanden (also Zähle _und_ Nenner haben).