2016-03-07 4 views
5

Ich drucke 2 Zeilen auf der Konsole. Sie drucken beide, aber wenn der zweite gedruckt wird, wechselt der erste zu dem zweiten, also sind die zwei Zeilen identisch. Ich habe das noch nie zuvor gesehen. Warum überschreibt der zweite Druck den ersten und wie behebe ich ihn?System out println

public static void main(String args[]){ 
    new MergeSort(90000); 

    System.out.println("Array to be mergesorted: " +Arrays.toString(array)); 

    long start = System.currentTimeMillis(); 

    mergeSort(array, 1, array.length); 

    long end = System.currentTimeMillis(); 

    System.out.println("Result: " + Arrays.toString(array)); 
} 

Der Konstruktor:

public MergeSort(int n){ 
    Random rand = new Random(); 
    array = new int[n]; 
    for(int i = 0; i <array.length; i++){ 
     array[i] = rand.nextInt(101); 
    } 
} 

übriges Code:

public static void merge(int[] A, int p, int q, int r){ 
    // 
    //length of subarray 1 
    int n1 = q-p+1; 

    //length of subarray 2 
    int n2 = r-q; 

    int[] L = new int[n1+1]; 
    int[] R = new int[n2+1]; 

    for(int i = 0; i < n1; i++){ 
     L[i] = A[p+i-1]; 
    } 

    for(int j=0; j< n2; j++){ 
     R[j] = A[q+j]; 
    } 

    L[n1] = Integer.MAX_VALUE; 
    R[n2] = Integer.MAX_VALUE; 

    int i = 0; 
    int j = 0; 

    for(int k = p-1; k < r; k++){ 
     if(L[i] <= R[j]){ 
      A[k] = L[i]; 
      i++; 
     } 
     else{ 
       A[k] = R[j]; 
       j++; 
      } 
    } 

} 

public static void mergeSort(int[] A, int p, int r){ 
    if (p<r){ 
     int q = (int) Math.floor((r+p)/2); 
     mergeSort(A, p, q); 
     mergeSort(A, q+1, r); 
     merge(A, p, q, r); 
    } 
} 
+0

Was macht Ihr 'MergeSort'-Konstruktor mit' new MergeSort (90000) '? Und was macht Ihre Anweisung 'mergeSort (array, 1, array.length)'? –

+0

@EliottFrisch Der von Ihnen angeforderte Code wurde hinzugefügt. – Jesper

+0

Ich * vorschlagen * Sie versuchen einen Debugger. –

Antwort

5

Dies ist an die Puffergrenze der Konsole in Ihrem IDE durch. Ich kann nicht erklären, warum genau du eine doppelte Ausgabe bestimmter Strings siehst, außer zu sagen, dass es so aussieht, als ob ein Fehler darin besteht, wie alte Zeichen im Puffer gelöscht werden, wenn es das Limit erreicht.

Ich denke, Eclipse kommt mit einem Standard von 80.000 Zeichen Grenze in seiner Konsolenausgabe. Da Sie 90.000 Zahlen zwischen 1-100 zweimal drucken, bedeutet dies, dass Sie diesen Puffer und dann einige Überaufnahmen machen.

Um die Puffergrenze auf der Konsole zu erhöhen:

  • Direkt am Ausgabefenster in Eclipse klicken und wählen Sie perferences
  • Change „Console Puffergröße (Zeichen)“ die gewünschte Grenze.

Im Idealfall würde es zu etwas höher als die maximalen Zeichen ändern, die Sie für dieses Programm ausdrucken. Vielleicht etwa 800.000?


Hier ein Bild des Einstellungsfensters. enter image description here

Edit: Diese Frage erinnert mich an another interesting question, in dem die Antwort auf die Frage innerhalb belogen, wie der Zeilenumbruch in der Terminal-Ausgabe durchgeführt wurde. Nicht wirklich das gleiche wie diese Frage, aber es ist verwandt und eine ziemlich interessante Frage/Antwort. Es ist lesenswert und es ist definitiv eine Lektion in all dem zu lernen.