BubbleSort-Methode

_Paranormal

Aktives Mitglied
Hallo, ich habe ein kleines Problem mit meiner BubbleSort-Methode.
Das Programm soll zufällige Uhrzeiten erstellen und diese dann mit Bubblesort sortieren.

Java:
import java.util.*;

class TestTime {

  static Random random = new Random(12345);

  public static void main(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 = new Time[n];
    for (int i = 0; i < a.length; ++i) {
      // zufaellige Initialisierung von Stunde und Minute
      a[i] = new Time(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:
class SomeUtilities {

  static void bubbleSort(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;
  	  	  	  }
  	  	  }
  	  }
  }
  	  	  	  
  static void print(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.

Wäre nett, wenn mir jemand helfen könnte 🙂 Danke
 
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.
 
Mh. Also den Vergleich könnte man dann mit equals(..) machen, oder?

Aber das mit dem a versteh ich nicht ganz. Muss ich dafür eine andere Variable deklarieren?
 
Natürlich.
Folgendes geht ja auch nicht:

Java:
String string = "String";
Scanner scanner = new Scanner(System.in);
string = scanner;

Mit equals kannst du aber nicht lexographisch ordnen. Da Time aber von Date erbt, hat es natürlich auch #getTime(), die eine long liefert.
 
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.

Java:
if (a[j].getTime() > a[j+1].getTime()) {
 
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.

Jetzt kannst du die beiden vergleichen.
 
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
 
Also das Array dürfte nur aus Zahlen bestehen, aus int hour und int minute. Dürfte doch dann gehen?

Ah, vllt eher valueOf?
 
Zuletzt bearbeitet:
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.
 

Zurück
Oben