Das wäre die Berechnung des Medians in einem eindimensionalen Array. Ich komme aber einfach nicht darauf, wie ich das für ein 2d implementieren muss.. Also ich möchte ich die einzelnen Mediane von jedem Teilarray.
Ein 2D-Array ist nichts anderes als ein Array von Array. Du kannst das äußere Array also wie ein einfaches Array betrachten und es iterieren. Das Iterationsobjekt ist ein inneres Array, welches du in deine Funktion schubsen kannst.
Java:
int[][] table =newint[m][n];for(int[] row : mn){double d =median(row);}
for(int m =0; m < array.length; m++){for(int n =0; n < array.length; n++){int middle = array.length /2;if(array.length %2==1){
array[m][n];for(double[] row:mn){double[] d =medianInception(row);}}else{return(array[middle -1]+ array[middle])/2.0;}}}
Ich habe folgende Anmerkungen
1. Das ist keine Sortierung, zumindest nicht vollumfänglich. 2 3 1 würde z.B. nicht richtig sortiert werden, weil 3 und 1 zwar vertauscht werden würden, jedoch nicht dann auch 1 und 2
2. Bei der ersten inneren Schleife hast du korrekt die Größe von array[i] verwendet. Bei der zweiten inneren Schleife jedoch nicht. Das führt zu NPE, falls du weniger Spalten als Reihen hättest
3. Bist du dir sicher, dass die Methode einen einzelnen double Wert zurückgeben soll? Ich meine ja, dass das eher ein double Vektor (also ein double Array) sein sollte.
1. Das ist keine Sortierung, zumindest nicht vollumfänglich. 2 3 1 würde z.B. nicht richtig sortiert werden, weil 3 und 1 zwar vertauscht werden würden, jedoch nicht dann auch 1 und 2
Was muss ich da denn noch ändern? Genau diesen Algorithmus haben wir vorgelegt bekommen, der auch nachdem ich mir über den Ablauf von dem Algorithmus Gedanken gemacht habe, Sinn gemacht hat.
Java:
for(int i =0; i < array.length-1; i++){for(int j = i +1; j >0; j--){if(array[i][j]< array[i-1][j]){double temp = array[i-1][j];
array[i-1][j]= array[i][j];
array[i][j]= temp;}}}
Bei der ersten inneren Schleife hast du korrekt die Größe von array[i] verwendet. Bei der zweiten inneren Schleife jedoch nicht. Das führt zu NPE, falls du weniger Spalten als Reihen hättest
Bist du dir sicher, dass die Methode einen einzelnen double Wert zurückgeben soll? Ich meine ja, dass das eher ein double Vektor (also ein double Array) sein sollte.
Nein. Es sollen die Mediane der 2D-Teilarrays berechnet werden. Diese widerrum sollen in ein Eindimensionales kopiert werden. Und aus dem Eindimensionalen widerrum soll der Median berechent werden, weshalb der Rückgabetyp so stimmt.
Was muss ich da denn noch ändern? Genau diesen Algorithmus haben wir vorgelegt bekommen, der auch nachdem ich mir über den Ablauf von dem Algorithmus Gedanken gemacht habe, Sinn gemacht hat
for(int j =0; j < array[i].length -1; j++){// hier ist korrekt array[i] in der Bedingungfor(int n =0; n < array.length; n++){// hier fehlt das, es müsste array[m] sein
Nein. Es sollen die Mediane der 2D-Teilarrays berechnet werden. Diese widerrum sollen in ein Eindimensionales kopiert werden. Und aus dem Eindimensionalen widerrum soll der Median berechent werden, weshalb der Rückgabetyp so stimmt.
Aha! Jetzt kommen wir langsam auf einen Nenner. Du hast die Methode doch schon für einen 1D-Median. Die kannst du wiederverwenden.
Java:
publicdoublemedian1D(double[] array1D){// deine Logik von oben, ich würde allerdings auch die Sortierung von dem Array hier machen}publicdoublemedian2D(double[][] array2D){double[] medianPerRow =newdouble[array2D.length];for(int i =0; i < array2D.length; i++){
medianPerRow[i]=median1D(array2D[i]);}returnmedian1D(medianPerRow);}
Nein du sollst nicht das 2D-Array sortieren, sondern nur das einzelne Array jeweils.
Deine Schleifen kommen Bubblesort sehr nahe, aber wie gesagt nur ein einzelnes Array, kein 2D-Array. Hier der Code von Wikipedia
Code:
bubbleSort(Array A)
for (n=A.size; n>1; --n){
for (i=0; i<n-1; ++i){
if (A[i] > A[i+1]){
A.swap(i, i+1)
} // Ende if
} // Ende innere for-Schleife
} // Ende äußere for-Schleife
Schau dir nochmal Antwort #9 an. Die 2D-Methode sollte so wie sie ist schon richtig sein. Du musst nur die Benennung noch anpassen. Du baust dir die Hilfsmethode für 1D zusammen und die Hilfsmethode sortiert das übergebene Array auch mit Bubblesort. Den Code für Bubblesort hast du ja auch schon, du darfst nur nicht den Fehler machen versuchen Bubblesort auf dein 2D-Array anzuwenden.
Du hast doch bereits eine Methode, um ein eindimensionales Array zu sortieren.
Ein zweidimensionales Array ist ein Array von eindimensionalen Arrays! (Diesen Satz solltest du verstehen!)
Du kannst das zweidimensionale Array also durchiterieren und für jeden Eintrag die Sortier-Methode für ein eindimensionales Array aufrufen.
boolean swapped ;do{
swapped =false;for(int i =1; i < array.length ; i ++)if( array[i -1]> array [i]){double swap = array [i];
array[ i ]= array [ i -1];
array[ i -1]= swap ;
swapped =true;}}while(swapped);// nicht richtig formatiert, Tastatur reagiert irgendwie nicht auf die Tastenkombination(Strg, Shift & F)
Das wäre ja dann die Sortiermethode für ein Eindimensionales.
Ein zweidimensionales Array ist ein Array von eindimensionalen Arrays! (Diesen Satz solltest du verstehen!)
Du kannst das zweidimensionale Array also durchiterieren und für jeden Eintrag die Sortier-Methode für ein eindimensionales Array aufrufen.
Ja, den Satz verstehe ich. Um das Zweidimensionale durchzuiterieren, müsste ich doch jetzt noch eine for-Schleife hinzufügen, oder nicht?
Was fehlt noch @fhoffmann
Nein, darum geht es mir nicht. In #9 steht aber nicht, wie ich die Teilarrays jetzt sortiere. Mein Sortierverfahren sollte in Form von bubbleSort das 2D array sortieren. Mir ist gerade aufgefallen beim richtigen Hinschauen, dass ich etwas durcheinander geworfen hatte.
Wie könnte ich das von #9 jetzt aber in einer Methode, etwa in der median2D Methode alles in einem implementieren. Da in der Aufgabenstellung nichts von der Erlaubnis von Hilfsmethoden steht, denn normalerweise steht es dabei, wenn erlaubt.
Du kannst ein 2D-Array aber nicht sortieren, du kannst nur einen Vektor sortieren, also eine Zeile oder eine Spalte. Du wirst trotzdem das 2D-Array iterieren und jede Zeile in sich sortieren müssen. Das iterieren ist eine Schleife, Bubblesort sind 2. Wenn du also wirklich darauf bestehst dann brauchst du 3 verschachtelte Schleifen.
Ich denke du muss versuchen dir Bubblesort nochmal vor Augen zu halten.
Beispiel
5 2 3 1 4
Im Ersten Durchlauf wird das 1. Element mit allen anderen verglichen und ggf. vertauscht.
5 vs 2 --> swap ( 2 5 3 1 4 )
2 vs 3
2 vs 1 --> swap ( 1 5 3 2 4 )
1 vs 4
1 5 3 2 4
Im zweiten Durchlauf dann das 2. Element mit den nachfolgenden Elementen (an erster Stelle ist jetzt schon das niedrigste)
5 vs 3 --> swap ( 1 3 5 2 4 )
3 vs 2 --> swap ( 1 2 5 3 4 )
2 vs 4
1 2 5 3 4
Im dritten Durchlauf das 3. Element mit den Nachfolgeelementen
5 vs 3 --> swap (1 2 3 5 4)
3 vs 4
Du bist lustig, im überübernächsten Satz fragst Du bereits wieder, wie Du jetzt alles in eine Methode bekommst. Ich glaube Dir sogar, dass es Dir gar nicht ums Kopieren geht und das war von mir auch nicht böse gemeint, aber wenn Du Dir jede Lösung bis zum bitteren Ende vorkauen lässt, wirst Du nie selbständig eine finden. Man hat das Gefühl, Du stocherst irgendwie in der Gegend rum, weißt aber gar nicht, was Du da eigentlich tust.
for(int i =0; i < array[i].length; i++){for(int j =0; j < array[j].length; j++){for(int k =0; k < array[i].length){if(array[i][j]> array[i][j +1]){double temp = array[i][j];
array[i][j]= array[i][j +1];
array[i][j +1]= temp;}}}
Ich denke so ist es auch nicht richtig. Warum muss ich denn jetzt noch iterieren; Keine Ausrede: Aber ich finde die Aufgabe vom Verständnis bzw. Prinzip nicht schwer. Ich hab einfach keine Ahnung, wie ich jetzt noch richtig iterieren soll..
Du bist lustig, im überübernächsten Satz fragst Du bereits wieder, wie Du jetzt alles in eine Methode bekommst. Ich glaube Dir sogar, dass es Dir gar nicht ums Kopieren geht und das war von mir auch nicht böse gemeint, aber wenn Du Dir jede Lösung bis zum bitteren Ende vorkauen lässt, wirst Du nie selbständig eine finden. Man hat das Gefühl, Du stocherst irgendwie in der Gegend rum, weißt aber gar nicht, was Du da eigentlich tust.
Ich weiß schon, was ich tue. Ich weiß auch, dass es nicht so wirkt. Aber das ist natürlich auch mir geschuldet, keine Frage.
Jedoch kamen wir erst eben darauf, dass es dann doch widerrum 3 Schleifen benötigt.
Ich möchte nochmal darauf plädieren, dass du dir Hilfsmethoden anlegst.
a) Der Prof wird das nicht ein Leben lang drunterschreiben. Irgendwann muss es selbstverständlich sein. Und für diese Aufgabe wäre es echt schrecklich, wenn sie nicht erlaubt sein würden.
b) Und selbst wenn du es nicht darfst, machs doch trotzdem erst. Es erleichtert die Struktur und damit deine Gedanken. Den Code kannst du doch anschließend auch aus den Hilfsmethoden an die entsprechenden Stellen kopieren
a) Der Prof wird das nicht ein Leben lang drunterschreiben. Irgendwann muss es selbstverständlich sein. Und für diese Aufgabe wäre es echt schrecklich, wenn sie nicht erlaubt sein würden.
Als Ergebnis erhalte ich 5.0., was ja eigentlich korrekt ist. Die Aufgabenstellung für die Nachvollziehbarkeit:
Zunächst sollen die Mediane der Teilarrays berechnet werden. Beachten Sie, dass diese unsortiert sein können! Wie man den Median bestimmt können Sie beispielsweise auf Wikipedia nachlesen: https://de.wikipedia.org/wiki/Median. Zum Sortieren der einzelnen Arrays verwenden Sie BubbleSort, InsertionSort oder SelectionSort. Deren Mediane werden dann jeweils in ein neues (eindimensionales) Array eingetragen, von diesem wiederum erneut der Median berechnet und anschließend zurückgegeben wird. Falls eines der Arrays null oder leer ist, dann soll Double.NaN zurückgegeben werden.
Hinweis: Bei der Abfrage ob ein Array null oder leer ist, muss null immer zuerst abgefragt werden, sonst tritt eine NullPointerException auf!
Wie aber kommt es jetzt zu den Fehlermeldungen:
Java:
1)testSonderfallLeer(PublicTests)
java.lang.ArrayIndexOutOfBoundsException:Index-1 out of bounds for length 0
at Functionality.bubbleSort(Functionality.java:33)
at Functionality.medianInception(Functionality.java:40)
at PublicTests.testSonderfallLeer(PublicTests.java:29)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:52)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at org.junit.runner.JUnitCore.runMain(JUnitCore.java:77)
at org.junit.runner.JUnitCore.main(JUnitCore.java:36)2)testSonderfallNull(PublicTests)
java.lang.NullPointerException
at Functionality.bubbleSort(Functionality.java:11)
at Functionality.medianInception(Functionality.java:40)
at PublicTests.testSonderfallNull(PublicTests.java:22)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:52)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at org.junit.runner.JUnitCore.runMain(JUnitCore.java:77)
at org.junit.runner.JUnitCore.main(JUnitCore.java:36)3)testNormal(PublicTests)
java.lang.AssertionError: expected:<-3.5> but was:<NaN>
at org.junit.Assert.fail(Assert.java:88)
at org.junit.Assert.failNotEquals(Assert.java:834)
at org.junit.Assert.assertEquals(Assert.java:553)
at org.junit.Assert.assertEquals(Assert.java:683)
at PublicTests.testNormal(PublicTests.java:17)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:52)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at org.junit.runner.JUnitCore.runMain(JUnitCore.java:77)
at org.junit.runner.JUnitCore.main(JUnitCore.java:36)
?
Java:
publicclass calculateMedian {publicstaticvoidmain(String[] args){double[][] arr ={{2,5,3,8,6},{2,5,3,8,6}};System.out.println(medianInception(arr));}publicstaticdoublebubbleSort(double[] arr){for(int i =0; i < arr.length; i++){if(arr ==null|| arr[i]==0){returnDouble.NaN;}}boolean swapped;do{
swapped =false;for(int i =1; i < arr.length; i++)if(arr[i -1]> arr[i]){double swap = arr[i];
arr[i]= arr[i -1];
arr[i -1]= swap;
swapped =true;}}while(swapped);int middle = arr.length /2;if(arr.length %2==1){return arr[middle];}else{return(arr[middle -1]+ arr[middle])/2.0;}}publicstaticdoublemedianInception(double[][] array){double[] a =newdouble[array.length];for(int i =0; i < array.length;++i){
a[i]=bubbleSort(array[i]);}int median = a.length /2;if(a.length %2==1){return a[median];}return(a[median -1]+ a[median])/2;}}
Schon die Methodendeklaration sieht komisch aus.
Warum sollte eine Methode bubbleSort einen double zurückgeben.
Und was hat die Berechnung eines Medians in einer solchen Merhode zu tun.
Bitte benenne deine Methoden vernünftig. Und benutze bereits fertige Methoden!
Falls ein Array null oder leer ist, nicht falls ein Array Element null oder leer ist. Ein double Array Element kann auch nicht null oder leer sein, das ist ein primitiver Datentyp und kein Objekt.
Ich habe die Anweisung dann jetzt so formuliert.
Warum erscheint diese Meldung noch..?
Java:
1)testSonderfallNull(PublicTests)
java.lang.AssertionError: expected:<NaN> but was:<5.5>
at org.junit.Assert.fail(Assert.java:88)
at org.junit.Assert.failNotEquals(Assert.java:834)
at org.junit.Assert.assertEquals(Assert.java:553)
at org.junit.Assert.assertEquals(Assert.java:683)
at PublicTests.testSonderfallNull(PublicTests.java:23)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:52)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at org.junit.runner.JUnitCore.runMain(JUnitCore.java:77)
at org.junit.runner.JUnitCore.main(JUnitCore.java:36)
Übrigens, ich habe gerade festgestellt, dass du in diese Bedingung nie reinlaufen wirst, warum weiß ich nicht genau, aber das könnte auch bei dir passieren oder passiert sein.
Java:
double d =Double.NaN;if(d ==Double.NaN){// wird nicht erreicht}
Du musst für d en Vergleich die Double::isNaN Methode aufrufen.
Das habe ich jetzt nicht verstanden. Den Code, den du da notiert hast, verstehe ich jetzt bezogen auf mein Programm nicht wirklich.
Die isNaN Methode hast du da ja auch nicht verwendet...
Ich habe ja auch das negativ-Beispiel aufgeführt. In dem Inline Kommentar steht dass das innere der if-Bedingung nicht erreicht wird. Richtig wäre es mit isNaN. Du wirst es nicht unbedingt brauchen, kommt ganz darauf an wie du den Code aufziehst. Ich wollte es dir nur schon mitgeben, falls du es brauchen wirst.
Also, ich habe die Abfrage jetzt in die medianInception-Methode geschrieben:
Java:
publicstaticdoublemedianInception(double[][] array){double[] a =newdouble[array.length];for(int i =0; i < array.length;++i){
a[i]=bubbleSort(array[i]);}if(a ==null|| a.length ==0){returnDouble.NaN;}int median = a.length /2;if(a.length %2==1){return a[median];}return(a[median -1]+ a[median])/2.0;}
isNaN verwenden zu sollen kann ich immer noch nicht ganz nachvollziehen, denn es heißt ja in der Aufgabenstellung, dass einfach nur abgefragt werden soll, ob das array null || array.length == 0 ist. Wenn ja, dann soll Double.NaN zurückgeliefert werden...
Du hast ja immernoch einen Rückgabewert im bubblesort. Tu mir den Gefallen und lies nochmal alle Kommentare, versuche sie zu verstehen. Aktuell machst du nur Müll, man hat wirklich das Gefühl du stocherst nur so herum. Und das ist nicht mal böse gemeint.
isNaN verwenden zu sollen kann ich immer noch nicht ganz nachvollziehen, denn es heißt ja in der Aufgabenstellung, dass einfach nur abgefragt werden soll, ob das array null || array.length == 0 ist. Wenn ja, dann soll Double.NaN zurückgeliefert werden...
Das liegt daran, dass du vermutlich einen Fall vergisst. Es kann sowohl das 2D-Array null oder leer sein, als auch jedes Teilarray. Die Teilarrays kannst du an verschiedenen Stellen prüfen. Die meisten Varianten würden Double::isNaN brauchen, jedoch nicht alle.
Beispiel
Java:
double[][] arr ={null,{2,5,6},{9,2,8},{4,4,4}};// Teilarray ist nulldouble[][] arr ={};// 2D-Array ist leer
@fhoffmann Ich habe die Berechnung dort hingeschrieben, weil ich dachte, dass es wie mit der Sortierung ist. Wenn ich dementsprechend sozusagen auch in der bubbleSort-Methode auch den Median des sortierten Arrays berechne, dass sich das dann auch auf die Teilarrays des zweidimensionalen Arrays der medianInception-Methode auswirkt. Sozusagen, dass dann die Mediane der Teilarrays direkt in
Ich habe keine Lust mehr und gebe auf. Ich habe die Hoffnung, dass du es vielleicht mit dem fertigen Beispiel besser verstehst was wir alle bisher geschrieben haben. Bitte öffne das nur, wenn du mir versprichst alles noch einmal nachzuvollziehen.
Java:
privatestaticvoidbubbleSort(double[] arr){for(int i =0; i < arr.length; i++){for(int j = i +1; j < arr.length; j++){if(arr[i]> arr[j]){// swapdouble temp = arr[i];
arr[i]= arr[j];
arr[j]= temp;}}}}privatestaticdoublemedianInception(double[] arr){// sort the array (byReference)bubbleSort(arr);// return the medianint middle = arr.length /2;if(arr.length %2==1){return arr[middle];}else{return(arr[middle -1]+ arr[middle])/2.0;}}publicstaticdoublemedianInception(double[][] arr){// return NaN if 2D-Array is null or emptyif(arr ==null|| arr.length ==0){returnDouble.NaN;}// return NaN if Sub-Array is null or emptyfor(double[] subArr : arr){if(subArr ==null|| subArr.length ==0){returnDouble.NaN;}}// calculate the median of each sub-array and store it in a new arraydouble[] mediane =newdouble[arr.length];for(int i =0; i < arr.length; i++){
mediane[i]=medianInception(arr[i]);}// return the median of the new arrayreturnmedianInception(mediane);}