Bubblesort mehrdimensionales Double Array?


20.11.2020, 12:02

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.

Woher ich das weiß:Studium / Ausbildung – Abgeschlossenes Informatik-Studium
anna0811 
Fragesteller
 20.11.2020, 12:06

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.

0
Christoph987  20.11.2020, 12:14
@anna0811

Der Typ des Arrays und der Typ des Index haben nichts miteinander zu tun. Der Index gibt nur an, auf welches Element du zugreifst.

0
alfredo153  20.11.2020, 12:14
@anna0811

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?

0
anna0811 
Fragesteller
 20.11.2020, 12:17
@Christoph987

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.

0
anna0811 
Fragesteller
 20.11.2020, 12:18
@alfredo153

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.

0
alfredo153  20.11.2020, 12:26
@anna0811

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?

0
anna0811 
Fragesteller
 20.11.2020, 12:34
@alfredo153

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.

0
alfredo153  20.11.2020, 12:37
@anna0811

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.

0
anna0811 
Fragesteller
 20.11.2020, 12:57
@alfredo153

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.

0
alfredo153  20.11.2020, 13:00
@anna0811
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.

0
anna0811 
Fragesteller
 20.11.2020, 13:05
@alfredo153

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 :(

0
anna0811 
Fragesteller
 20.11.2020, 13:06
@alfredo153

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.

0
alfredo153  20.11.2020, 13:09
@anna0811

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

0
anna0811 
Fragesteller
 20.11.2020, 13:34
@alfredo153

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?

0
DonkeyShot  20.11.2020, 12:20

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()()")

0
alfredo153  20.11.2020, 12:33
@DonkeyShot

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).

0
DonkeyShot  20.11.2020, 16:18
@alfredo153

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.)

0

Variable 'c' ist nirgends deklariert. Das array heißt a, nicht i. Als Schleifenvariable verwendest du eine Double statt einer Integer-Variablen.

Woher ich das weiß:Studium / Ausbildung – Datenverarbeitungs-Kfm, Hobby- und Profi-Programmierer
anna0811 
Fragesteller
 20.11.2020, 12:08

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);

	}
0
DonkeyShot  20.11.2020, 12:11
@anna0811

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.

0