drago
Champion
- Registriert
- 11 April 2003
- Beiträge
- 13.452
Was mir auf jeden Fall mal auffällt: Die Zeile
while (breakpoints2.length > 0) { breakpoints2.pop(); }
ist sinnlos. Eventuell soll da eher eine 1 stehen, aber breakpoints2 ist bis dahin noch nicht benutzt/gefüllt worden.
Dann fällt mir folgendes auf
Das ist eigentlich überflüssig kompliziert, denn der Rückgabewert von shift ist ja gerade der Wert von [0]. Also müsste man in der Klammer als Einzeiler schreiben können "breakpoints.push(breakpoints2.shift());"
Und jetzt zu der letzten Schleife
Ich kann nur Hinweise geben, da ich nicht weiß, ob alles erfüllt ist, was ich mir denke. Lies erst zu Ende, ich habe einiges erst beim Schreiben verstanden.
1. Die for-Zeile geht davon aus, dass beide Arrays nach Größe sortiert sind, also das größte "i" ganz hinten im Array steht. Außerdem darf keines der Arrays leer sein, mehr dazu ganz unten.
Wenn wir das mal als eindimensionale Arrays sehen, könnten das folgende Zahlenreihen sein
breakpoints1 = (10, 20, 30, 40, 50)
breakpoints2 = (15, 20, 25, 30, 35)
Führt mich zu Punkt 2: gibt es gleiche Werte in den Arrays?
Aber der Reihe nach. Erster relevanter Durchlauf: i = 0
Erster if: schlägt nicht zu
Zweiter if: schlägt nicht zu
Dritter if: Fehler: Breakpoints.length()-2 ist nicht definiert, da breakpoints noch leer ist.
Nehmen wir an, wir umschiffen diese Hürde, dann verstehe ich den letzten if trotzdem nicht. Du vergleichst den letzten und vorletzten Wert, und falls diese gleich sind, weist du dem vorletzten irgendwas berechnetes zu und löschst den letzten. Aber gut, nehmen wir weiter an, das sei sinnvoll.
Nächster relevanter Durchlauf (eigentlich der erste wirklich relevante aufgrund der Werte): i = 10
Erster if: schlägt zu, ein push wird durchgeführt.
Zweiter if: schlägt nicht zu
Dritter if: immer noch Fehler:, das Array enthält nur einen Wert, Länge ist 1, Länge -2 ist -1. Ende negativ ganz schlecht.....
Beim Wert 15 kann das ganze erstmalig funktionieren, dem zweiten Array wird ein Wert entnommen und dem Ergebnis zugefügt. Letztes If schlägt nicht zu.
Beim Wert 20 schlagen beide Ifs zu, das Resultat erhält zwei mal den Wert 20, was du durch den letzten if irgendwie änderst. Ok, scheint also doch Sinn zu machen.
Die nachfolgenden sind uninteressant, bis der Wert 35 überschritten wird, also 36.
Erster if: schlägt nicht zu
Zweiter if: Fehler: Zugriff auf ein Array, das inzwischen durch Pop geleert wurde.
Dritter : egal
Alle weiteren Werte führen zu demselben Fehler. Es gibt aber noch den Sonderfall, das beide Max-Werte identisch sind, das scheint aber zu funktionieren.
Noch was: Ich weiß nicht, wie Javascript intern die Schleifenbedingung prüft: Wenn sie nur einmalig ganz zum Beginn der Schleife geprüft wird, ist alles in Ordnung. Wenn aber die Bedingungen mit Math.max bei jedem Durchlauf erneut ausgewertet wird, dann funktioniert das spätestens dann nicht mehr sinnvoll, wenn eines der Arrays leer ist.
Besser so:
Dann muss nicht bei jedem Durchlauf auf array[length-1] zugegriffen werden.
Ich hoffe, das war jetzt alles verständlich.
Lös erst mal diese Probleme, dann stell die Fragen erneut. Ich weiß nicht, was sich dadurch schon beheben lässt.
while (breakpoints2.length > 0) { breakpoints2.pop(); }
ist sinnlos. Eventuell soll da eher eine 1 stehen, aber breakpoints2 ist bis dahin noch nicht benutzt/gefüllt worden.
Dann fällt mir folgendes auf
Code:
if (breakpoints2[0][0] == i)
{
breakpoints.push(breakpoints2[0]);
breakpoints2.shift();
}
Das ist eigentlich überflüssig kompliziert, denn der Rückgabewert von shift ist ja gerade der Wert von [0]. Also müsste man in der Klammer als Einzeiler schreiben können "breakpoints.push(breakpoints2.shift());"
Und jetzt zu der letzten Schleife
Code:
for (i=0; i <= Math.max(breakpoints1[breakpoints1.length-1][0],breakpoints2[breakpoints2.length-1][0]); i++)
{
if (breakpoints1[0][0] == i)
{
breakpoints.push(breakpoints1[0]);
breakpoints1.shift();
}
if (breakpoints2[0][0] == i)
{
breakpoints.push(breakpoints2[0]);
breakpoints2.shift();
}
if (breakpoints[breakpoints.length-1][0] == breakpoints[breakpoints.length-2][0])
{
breakpoints[breakpoints.length-2].value = [i,(breakpoints[breakpoints.length-2][1] + breakpoints[breakpoints.length-1][1])/2]
breakpoints.pop();
}
}
Ich kann nur Hinweise geben, da ich nicht weiß, ob alles erfüllt ist, was ich mir denke. Lies erst zu Ende, ich habe einiges erst beim Schreiben verstanden.
1. Die for-Zeile geht davon aus, dass beide Arrays nach Größe sortiert sind, also das größte "i" ganz hinten im Array steht. Außerdem darf keines der Arrays leer sein, mehr dazu ganz unten.
Wenn wir das mal als eindimensionale Arrays sehen, könnten das folgende Zahlenreihen sein
breakpoints1 = (10, 20, 30, 40, 50)
breakpoints2 = (15, 20, 25, 30, 35)
Führt mich zu Punkt 2: gibt es gleiche Werte in den Arrays?
Aber der Reihe nach. Erster relevanter Durchlauf: i = 0
Erster if: schlägt nicht zu
Zweiter if: schlägt nicht zu
Dritter if: Fehler: Breakpoints.length()-2 ist nicht definiert, da breakpoints noch leer ist.
Nehmen wir an, wir umschiffen diese Hürde, dann verstehe ich den letzten if trotzdem nicht. Du vergleichst den letzten und vorletzten Wert, und falls diese gleich sind, weist du dem vorletzten irgendwas berechnetes zu und löschst den letzten. Aber gut, nehmen wir weiter an, das sei sinnvoll.
Nächster relevanter Durchlauf (eigentlich der erste wirklich relevante aufgrund der Werte): i = 10
Erster if: schlägt zu, ein push wird durchgeführt.
Zweiter if: schlägt nicht zu
Dritter if: immer noch Fehler:, das Array enthält nur einen Wert, Länge ist 1, Länge -2 ist -1. Ende negativ ganz schlecht.....
Beim Wert 15 kann das ganze erstmalig funktionieren, dem zweiten Array wird ein Wert entnommen und dem Ergebnis zugefügt. Letztes If schlägt nicht zu.
Beim Wert 20 schlagen beide Ifs zu, das Resultat erhält zwei mal den Wert 20, was du durch den letzten if irgendwie änderst. Ok, scheint also doch Sinn zu machen.
Die nachfolgenden sind uninteressant, bis der Wert 35 überschritten wird, also 36.
Erster if: schlägt nicht zu
Zweiter if: Fehler: Zugriff auf ein Array, das inzwischen durch Pop geleert wurde.
Dritter : egal
Alle weiteren Werte führen zu demselben Fehler. Es gibt aber noch den Sonderfall, das beide Max-Werte identisch sind, das scheint aber zu funktionieren.
Noch was: Ich weiß nicht, wie Javascript intern die Schleifenbedingung prüft: Wenn sie nur einmalig ganz zum Beginn der Schleife geprüft wird, ist alles in Ordnung. Wenn aber die Bedingungen mit Math.max bei jedem Durchlauf erneut ausgewertet wird, dann funktioniert das spätestens dann nicht mehr sinnvoll, wenn eines der Arrays leer ist.
Besser so:
Code:
var max1 = breakpoints1[breakpoints1.length-1][0]
var max2 = breakpoints2[breakpoints2.length-1][0]
for (i=0, i<= Math.max(max1, max2), i++)
{...}
Dann muss nicht bei jedem Durchlauf auf array[length-1] zugegriffen werden.
Ich hoffe, das war jetzt alles verständlich.
Lös erst mal diese Probleme, dann stell die Fragen erneut. Ich weiß nicht, was sich dadurch schon beheben lässt.
