2016-03-07 11 views
5

Drukuję 2 linie do konsoli. Oba drukuje, ale gdy drukuje drugi, pierwszy zmienia się na drugi, więc 2 linie są identyczne. Nigdy wcześniej tego nie spotkałem. Dlaczego drugi nadruk zastępuje pierwszy i jak go naprawić?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)); 
} 

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

Reszta kodu:

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

Co robi konstruktor 'MergeSort' z' nowym MergeSort (90000) '? I co robi twoja instrukcja 'mergeSort (array, 1, array.length)'? –

+0

@ ElliottFrisch Kod, który prosiłeś, został dodany. – Jesper

+0

Ja * sugeruję * próbujesz debuggera. –

Odpowiedz

5

Wynika to z limitu bufora konsoli w swoim IDE. Nie potrafię wyjaśnić, dlaczego dokładnie widzisz duplikaty wyjściowe niektórych ciągów, inne niż twierdzenie, że wygląda na błąd w usuwaniu starych znaków z bufora, gdy osiągnie limit.

Myślę, że Eclipse ma domyślnie limit 80 000 znaków na wyjściu konsoli. Ponieważ drukujesz 90 000 liczb pomiędzy 1-100 dwa razy, co oznacza, że ​​przestrzeliłeś ten bufor, a potem kilka.

Aby zwiększyć limit bufora na konsoli:

  • Kliknij prawym przyciskiem myszy w oknie wyjściowym w Eclipse i wybierz Perferences
  • zmiana „Rozmiar bufora Console (znaki)” być pożądany limitu.

Idealnie zmieniłoby to ustawienie na wartość wyższą niż maksymalna liczba znaków drukowanych dla tego programu. Może coś w rodzaju 800 000?


Oto obraz okna preferencji. enter image description here

Edit: To pytanie przypomniało mi another interesting question w których odpowiedź na pytanie kłamał wewnątrz jak zawijanie przeprowadzono na wyjściu terminala. Nie tak bardzo jak to pytanie, ale jest to powiązane i dość interesujące pytanie/odpowiedź. Warto przeczytać i zdecydowanie można wyciągnąć wnioski z tego wszystkiego.