Bubblesort mehrdimensionales Double Array?
Hallo alle zusammen :) Ich bin gerade ein bisschen am rumprobieren. Meine Aufgabe ist es ein mehrdimensionales Double Array zu implementieren welches mit Bubblesort /Insertionsort oder Selectionsort sortiert wird, sodass ich danach noch eine doppelte Median-Berechnung implementieren kann. Ich weiß wie Bubblesort bei Integern funktioniert, nur mir werden Compilerfehler angezeigt, weil ein Double nicht zum Int gecastet werden kann. Nur ich arbeite doch schon von Anfang an mit Double-Werten. Muss ich die Double Werte erst zu Integern casten um Bubblesort anzuwenden? Ich stehe vollkommen auf dem Schlauch und weiß nicht weiter. Ich habe mir so viele Java-Videos angeguckt und kenne die Theorie, nur das anwenden im Programmcode fällt mir sehr schwer. Ich studiere Informatik und muss jede Woche Hausaufgaben lösen. Nur die Hausaufgaben entsprechen nicht den Vorlesungsinhalten und wir sollen uns das Programmieren komplett selbst aneignen. Wir haben bis jetzt nie gesehen wie ein Programm implementiert wird, nur die Theorie dahinter gelernt.
Ich hoffe mir kann jemand helfen. Ich möchte es auch alleine schaffen, schließlich hilft mir in der Klausur auch keiner, aber ich weiß nicht was ich noch machen soll. Ohne Vorwissen ist es wirklich schwer ein Programm zu implementieren, auch wenn man die Theorie dahinter kennt. Ich bin auch erst seit 3 Wochen am studieren und ich weiß, dass das eigentlich zu den Basics gehört :(
Bis jetzt habe ich lediglich das. (Klammern habe ich nicht alle mit eingefügt, aber an fehlenden Klammern liegt es auch nicht)
public static void main(String[] args) {
double[][] array = { { 1.0, 2.1, 3.0 }, { 2.0, 3.1, 1.0 } };
public static double medianInception(double[][] a) {
boolean swapped;
do {
swapped = false;
for (double i = 1; i < a.length; i++)
if (i[c - 1] > i[c]) {
double swap = i[c];
i[c] = i[c - 1];
i[c - 1] = swap;
swapped = true;
}
} while (swapped);
Ich darf keine Imports verwenden...
3 Antworten
Ich habe es so verstanden, dass ich ein zweidimensionales Array habe und die Werte (welche der Prof. selbst bestimmen wird und welche auch Double sein können) sollen aufsteigend sortiert werden. Dann soll ich die Mediane (also Durchschnitt) der Teilarrays bestimmen, diese in ein eindimensionales Array schreiben und daraus dann erneut den Median ermitteln.
Wenn ich das richtig verstehe sollst du einfach den schon bekannten Bubblesort mehrfach anwenden. Es ist sonst unklar, was "ein zweidimensionales Array sortieren" bedeuten soll. Etwa so:
private static double findMedian(double[] oneDimArray) {
// TODO: hier den einfachen bubblesort machen, medianwert finden
return 0;
}
public static double medianInception(double[][] array) {
double[] resultsArray = new double[array.length];
for (int i = 0; i < array.length; i++) {
double subMedian = findMedian(array[i]);
resultsArray[i] = subMedian;
}
return findMedian(resultsArray);
}
Wie immer gilt: zerlege dein Problem in einzelne Schritte, bevor du planlos eine große Lösung für alles anfängst...
Wieso ist dein Index für das Array ein double? Das muss int sein. Wenn du ein Array von Autos hättest, wäre dein Index ja auch kein Auto, sondern eine Zahl.
Es ist ein Array von Arrays. Daher kann auch jedes der Sub-Arrays eine andere Länge haben (sofern das sinnvoll ist: was es oft nicht ist, weil es dafür geeignetere Datenstrukturen gibt).
Meine Frage bezog sich auf den Unterschied bei der Deklaration zwischen 2D-Arrays und jagged Arrays (Arrays von Arrays).
Jagged:
https://www.geeksforgeeks.org/jagged-array-in-java/
2D:
https://www.geeksforgeeks.org/multidimensional-arrays-in-java/
Ich sehe da keinen Unterschied. Das hat mich nur verwundert. Anscheinend gibt es keine echten, mehrdimensionalen Arrays. Der Unterschied ist, dass bei mehrdimensionalen Arrays alle Elemente linear im Speicher liegen und über die Indizes direkt auf das jeweilige Element ohne weitere Referenzen zugegriffen werden kann.
(Ist somit also geklärt.)
Also kann ich ein Double Array haben und dabei aber mit Int's arbeiten? Sorry für so eine "dumme" Frage, aber wie gesagt ich bringe mir eigentlich alles selbst bei.
Der Typ des Arrays und der Typ des Index haben nichts miteinander zu tun. Der Index gibt nur an, auf welches Element du zugreifst.
Es geht um die Position im Array, d.h. den Index. Da sind nur Ganzzahlen sinnvoll - oder gibt es eine Hausnummer "3.14159" in deiner Straße?
Ah, ich verstehe. Und wie sortiere ich ein mehrdimensionales Array? Dazu finde ich leider nichts im Internet. Nur zu eindimensionalen Arrays. Ich weiß leider von Grund auf nicht wie ich auf zweidimensionale Arrays zugreife.
Die Aufgabenstellung lautet: Implementieren Sie eine doppelte Median-Berechnung als statische-public Methode. Die Methode bekommt als Eingabeparameter ein zweidimensionales Double-Array und gibt einen Double-Wert zurück.
Ich weiß z.B. nicht, was eine "doppelte Medianberechnung" sein soll - und wenn ich die Aufgabenstellung nicht verstehe, kann ich erst gar nicht mit einer Implementierung beginnen. Ist das irgendwie erläutert?
Ein zweidimensionales Array zu sortieren ist daher auch eine unklare Aufgabenstellung. Was soll der Endzustand sein? Jede Spalte oder Zeile in sich sortiert? Alle Werte sortiert, aber dann in welche Reihenfolge?
Ich habe es so verstanden, dass ich ein zweidimensionales Array habe und die Werte (welche der Prof. selbst bestimmen wird und welche auch Double sein können) sollen aufsteigend sortiert werden. Dann soll ich die Mediane (also Durchschnitt) der Teilarrays bestimmen, diese in ein eindimensionales Array schreiben und daraus dann erneut den Median ermitteln.
Das geht weit über unsere Vorlesungsmaterialien heraus. Uns wurde nie erklärt wie man mit mehrdimensionalen Arrays arbeitet. Es hieß immer, dass man darauf nicht groß eingeht, da es erst später dran kommt.
Ach so. Aber das ist doch nicht weiter schwer, wenn du schon ein eindimensionales Array sortieren kannst.
Du machst eine Schleife über das "große" Array, in der du jedes enthaltene Array nimmst, sortierst (kannst du schon!) und dessen Median findest. Mit diesen Medianen füllst du eben das neue Array und machst dasselbe damit. Fertig.
Mein Code sieht derzeit so aus:
public class Functionality {
public static void main(String[] args) {
double[][] array = { { 1.0, 2.1, 3.0 }, { 2.0, 3.1, 1.0 } };
}
public static double medianInception(double[][] a) {
boolean swapped;
do {
swapped = false;
for (int i = 1; i < a.length; i++) {
if (a[i - 1] > a[i]) {
int swap = a[i];
a[i] = a[i - 1];
a[i - 1] = swap;
swapped = true;
}
}
} while (swapped);
}
}
Mein Problem ist, dass ab
if (a[i - 1] > a[i]) {
die Fehlermeldung "The operator > is undefined for the argument type(s) double[], double[]" und "Type mismatch: cannot convert from double[] to int" kommt. Aber
public static double medianInception(double[][] a) {
wurde mir von der Uni vorgegeben.
The operator > is undefined for the argument type(s) double[], double[]"
Ja klar. Überleg mal - wie willst du zwei Arrays von double miteinander vergleichen? Nach der Summe der enthaltenen Zahlen? Oder nach dem Betrag, als Vektor betrachtet? Oder...? Die Größer-Relation ist eben nur für einzelne Skalare allgemein wohldefiniert.
Und wenn es keine definierte Größer- (oder Kleiner-)Relation gibt, kann man auch nicht sortieren.
Und wie schreibe ich dann eine Sortierung von einem mehrdimensionalen Double-Array? Wir haben noch nie mit einem mehrdimensionalen Array gearbeitet...
Tut mir leid wenn die Fragen für dich dumm sind :(
Mir fehlt leider grundlegendes Verständnis, da wir im Moment ja nur Online-Vorlesungen haben und da sollen wir dann von einer Gesamtzeit von 90min, 40 Minuten lang Aufgaben lösen und dann werden nur die Lösungen gepostet, ohne die Herangehensweise zu erklären. Und das schon seit der ersten Vorlesung.
Die Fragen sind nicht dumm, aber du könntest meine Antworten lesen. Also nochmal:
"Ein zweidimensionales Array sortieren" ist nicht klar definiert. Was nicht definiert ist, kann man auch nicht programmieren. Vergiss mal Java und überleg es dir auf Papier. Du hast eine zweidimensionale Matrix von Zahlen und sollst sie sortieren. Was bedeutet das? Sollen alle von links oben nach rechts unten zeilenweise sortiert werden? Oder doch spaltenweise von unten nach oben und rechts nach links?
Meine Interpretation der Angabe ist hier: https://www.gutefrage.net/frage/bubblesort-mehrdimensionales-double-array#answer-375375459
Sorry, ich habe die obere Antwort komplett übersehen. Ich verstehe was du mir sagen willst. Es kommt darauf an, wie ich alles sortiert haben möchte. Also jetzt in meinem Fall möchte ich die Werte in den Zeilen (nicht Spalten) der Größe nach aufsteigend sortiert haben. Danach möchte ich von den sortierten Zeilen den Median ermitteln. Zu guter Letzt dann die Mediane in ein eindimensionales Array umschreiben und daraus erneut den Median berechnen. So wäre der Ablaufplan, richtig?
Ich verstehe leider nicht ganz, was du in der medianInception Methode gemacht hast. Hast du mit double [] resultsArray auf eine Dimension zugegriffen? Sortiert hast du aber nicht, oder? Und in die findMedian Methode (eindimensionales Array) hast du dann das Ergebnis aus dem mehrdimensionalen Array reingeschrieben um dann erneut den Median zu ermitteln? Und wieso dann return=0?
Variable 'c' ist nirgends deklariert. Das array heißt a, nicht i. Als Schleifenvariable verwendest du eine Double statt einer Integer-Variablen.
Ja, hab ich eben auch gesehen. Habe gestern so viel rumprobiert, dass ich die Variablen nicht wieder korrigiert habe. Eigentlich sah es so aus.
public static void main(String[] args) {
double[][] array = { { 1.0, 2.1, 3.0 }, { 2.0, 3.1, 1.0 } };
}
public static double medianInception(double[][] a) {
boolean swapped;
do {
swapped = false;
for (double i = 1; i < a.length; i++)
if (a[i - 1] > a[i]) {
double swap = a[i];
a[i] = a[i - 1];
a[i - 1] = swap;
swapped = true;
}
} while (swapped);
}
int i, nicht double i. Den Algorhythmus hab ich mir jetzt nicht angesehen. Ich gebe zu, ich dachte, es sei C# und es damit versucht. Da es sich um ein 2D-Array handelt, kann ich die Elemente nicht mit einem einzigen Index ansprechen, da immer zwei Indizes benötigt werden. Ich würde also zwei verschachtelte Schleifen schreiben, aber ob das in Java anders geht, weiß ich leider nicht, sry.
Blöde Anschluss-Frage meinerseits (mangels Java-Kenntnissen): Ist double[][] ein 2D-Array oder ein jagged array, also ein Array von Arrays? .....Laut Web ist die Deklaration identisch. Kann das sein oder hab ich ne falsche Quelle?! Kenne es nur von VB (2D: "Double(,)", Jagged: "Double()()")