Hallo, ich habe ein kleines Problem mit meiner BubbleSort-Methode.
Das Programm soll zufällige Uhrzeiten erstellen und diese dann mit Bubblesort sortieren.
Java:
importjava.util.*;classTestTime{staticRandom random =newRandom(12345);publicstaticvoidmain(String[] args){int n;try{
n =Integer.parseInt(args[0]);}catch(ArrayIndexOutOfBoundsException e){System.out.println("Aufruf: TestTime Arraygroesse");return;}catch(NumberFormatException e){System.out.println("n muss ganze Zahl sein");return;}Time[] a =newTime[n];for(int i =0; i < a.length;++i){// zufaellige Initialisierung von Stunde und Minute
a[i]=newTime(random.nextInt(24), random.nextInt(60));}System.out.println("Vor Sortieren:");SomeUtilities.print(a);SomeUtilities.bubbleSort(a);System.out.println();System.out.println("Nach Sortieren:");SomeUtilities.print(a);}}
Java:
classSomeUtilities{staticvoidbubbleSort(Time[] a){for(int i =0; i < a.length;--i){for(int j =0; j < a.length;++j){if(a[j]> a[j+1]){
a = a[j];
a[j]= a[j+1];
a[j+1]= a;}}}}staticvoidprint(Time[] a){for(Time t: a){System.out.println(t +" ");}}}
Der Compiler meckert bei der Zeile 6 in der Klasse SomeUtilities wegen des > Operators. Außerdem in Zeile 7 wegen [ und in Zeile 8 passt ihm das a nicht.
Du kannst nur primitive Typen per > vergleichen. a ist ein Array, du kannst eine einzelne Variable (a[j]) nicht in eine Array-Variable kopieren. In Zeile 9 das Selbe nur umgekehrt.
Dein Vergleich ist wie oben schon gesagt falsch.
Du kannst die Time-Objekte nicht einfach so mit dem >-Operator miteinander vergleichen. Was du aber machen kannst, ist z.B. die Millisekunden der Objekte miteinander vergleichen.
Das bringt mir doch aber nichts, wenn ich zum Beispiel 14:05 Uhr habe und 10:52 Uhr. Ich brauche hier keine Sekunden zu vergleichen, lediglich nur die Stunden und Minuten ^^
Wie kannst du Tage und Stunden miteinander vergleichen? Gar nicht. Du musst beide zuerst auf eine gemeinsame Einheit bringen, was eben Millisekunden sind.
Tage in Millisekunden umrechnen.
Stunden in Millisekunden umrechnen.
Das ist doch egal ob eine Minute, Stunde, Tag oder Jahr ist. Der Vergleichsablauf ist immer identisch. Beide Zeitpunkte in Millisekunden umrechnen und dann vergleichen.
Deine Schleifen sind verkorkst: [c]for (int i = 0; i < a.length; --i) [/c] zählt rückwärts statt vorwärts. Außerdem verwendest du i nirgendwo im Schleifeninnern. Schau dir mal den Pseudocode bei Tante Wikipedia an: Bubblesort ? Wikipedia
Ja, das mit der Schleife hatte ich mittlerweile behoben. Aber je mehr ich mache, desto mehr verkorkse ich es mir. Weil auf der Folie Bubble.png - Bilder und Fotos kostenlos auf ImageBanana hochladen wird es ja auch einfach so gemacht, wie ich es hatte, aber ich verstehe nicht, warum dass dann nicht geht.
Nur aus Minuten. Wie Striker schon sagte, du musst auf eine gemeinsame Einheit umrechnen. Und um Komazahlen wenn möglich zu unterbinden ist das immer die kleinste.
Wenn du schauen willst, ob 1 Kilometer oder 900 Meter größer ist, schreibst du ja auch nicht Math.max(1, 900), sondern rechnest erst alles in Meter um.