2016-03-07 3 views
5

Я печатаю 2 строки на консоль. Они оба печатаются, но когда вторая печатается, первая меняется на вторую, поэтому две строки идентичны. Я никогда не сталкивался с этим раньше. Почему вторая печать перезаписывает первую и как ее исправить?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)); 
} 

Конструктор:

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

Остальной код:

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

Что делает конструктор 'MergeSort' с' new MergeSort (90000) '? И что делает ваша инструкция 'mergeSort (array, 1, array.length)'? –

+0

@ElliottFrisch Код, который вы запросили, теперь добавлен. – Jesper

+0

Я * предлагаю * вы попробуете отладчик. –

ответ

5

Это связано с ограничением буфера консоли в вашей IDE. Я не могу объяснить, почему именно вы видите дубликат вывода определенных строк, кроме как сказать, что это похоже на ошибку в том, как он очищает старые символы в буфере, когда он достигает предела.

Я думаю, что Eclipse имеет по умолчанию ограничение на 80 000 символов в своем консольном выпуске. Поскольку вы печатаете 90 000 номеров от 1 до 100 раз, это означает, что вы перебираете этот буфер, а затем некоторые.

Чтобы увеличить предел буфера на консоли:

  • правой кнопкой мыши на окне вывода в Eclipse, и выберите Perferences
  • Изменить «размер буфера консоли (символов)», чтобы быть вашим желаемый предел.

Идеально изменит его на нечто большее, чем максимальные символы, которые вы печатаете для этой программы. Может, что-то вроде 800 000?


Heres изображение окна предпочтений. enter image description here

Edit: Этот вопрос напомнил мне о another interesting question, в которых ответ на вопрос лгал внутри как слово упаковка была выполнена в выводе терминала. Не совсем то же самое, что и этот вопрос, но это связано и довольно интересный вопрос/ответ. Его стоит прочитать, и есть определенно урок, который нужно изучить во всем этом.

Смежные вопросы