2015-11-27 2 views
0

У меня есть очень простая программа, которая время, сколько времени требуется для выбора-сортировки 100000 номеров. Вот код:java-программа останавливается без ошибок

import java.util.Calendar; 
import java.util.GregorianCalendar; 

public class Stopwatch { 

    public static void main(String[] args) { 
     // Create a stopwatch 
     int howManyNumbers = 100000; 
     Integer[] numbers = new Integer[howManyNumbers]; 
     for (int i = 0; i < numbers.length; i++) { 
      numbers[i] = (int)(100 * Math.random()); 
     } 
     System.out.println("Array created"); 
     StopWatching watch = new StopWatching(); 

     System.out.println("Sorting started"); 
     for (int i = 0; i < numbers.length; i++) { 
      for (int j = i; j < numbers.length; j++) { 
       if (numbers[j] < numbers[i]) { 
        int temp = numbers[i]; 
        numbers[i] = numbers[j]; 
        numbers[j] = temp; 
       } 
      } 
     } 
     System.out.print("Finished the sort"); 
     watch.stop(); 
     System.out.println(); 
     System.out.println(watch.getElapsedTime()); 
     for (int i = 0; i < numbers.length; i++) { 
      System.out.print(numbers[i]); 
     } 

    } 

} 

Это работает, печатает «Array Создана» и «Сортировка Started» в консоль, идет на второй или два, а потом просто останавливается. Нет ошибки или предупреждения. Не печатает «Законченный вид» или что-то в этом роде. Предполагается напечатать «Законченный вид», а затем прошло время, которое возвращается из watch.getElapsedTime() (объект класса StopWatching, который работает, был протестирован в других средах).

Может ли кто-нибудь указать, что я здесь делаю неправильно?

ПРИМЕЧАНИЕ. Возвращаемый тип watch.getElapsedTime() - это длинный, который является временем в миллисекундах, рассчитанным с момента создания часов, когда вызывается метод watch.stop() (используя класс GregorianCalendar).

P.S. Я использую eclipse IDE

+1

Мы не можем воспроизвести проблему без класса 'StopWatching'. – RealSkeptic

+0

работает просто отлично (хотя мне пришлось удалить вызовы для секундомера). Вероятно, есть некоторая проблема с реализацией «Stopwatching», или это просто ошибка eclipse – Paul

+0

@ user3340140. В RealSkeptic есть точка, это то, что StopWatching в том же пакете вам нужно импортировать? Это из библиотеки? – HRgiger

ответ

2

Временами печатать новую строку (здесь println). Это очищает выходной буфер.

for (int i = 0; i < numbers.length; i++) { 
     System.out.println(numbers[i]); 
    } 

Одно замечание: лучше было бы использовать примитивный тип INT:

int[] numbers = new int[howManyNumbers]; 

Integer является класс-оболочка для Int значений. В противном случае используйте:

Integer temp = ... 

Моментально Integer/INT преобразования имеют место.

+0

Добавление в if (i% 10 == 0) { System.out.println(); } Работает ли инфляция. Но я не знаю почему. Позаботьтесь пролить свет? Следует отметить, что комментирование печати всех номеров также позволяет остальной программе работать. Это переполнение буфера печати или что-то еще? – Roclemir

+0

@RealSkeptic вы правы для 100_000², что может занять 3 года или около того. –

+0

Система System.out буферизуется. Теперь в среде IDE это перехватывается с помощью setOut, а в операционной системе ситуация разная. Когда буфер переполняется, полный буфер следует очистить, а затем переполненный текст будет записан. Операционная система имеет свой собственный буфер и может иметь подобный щелчок или может потребоваться более широкое распределение. Расходы трудно сказать. Linux/Mac, вероятно, быстрее, чем Windows. В любом случае вы увидите первый вывод консоли позже. Сколько зависит от размера _restricted_ размера буфера. И это не хорошо. –

5

Проблема заключается в выходе консольного интерфейса Eclipse.

Код

for (int i = 0; i < numbers.length; i++) { 
    System.out.print(numbers[i]); 
} 

печатает 100000 чисел в одной строке. Это не проблема при работе с java в консоли ОС.

Но когда это сделано в Eclipse, консоль просто выключается, удаляет любую предыдущую распечатку.


Это была моя первая попытка проанализировать:

Я думаю, что программа не остановилась, но все еще работает. Внутренняя часть цикла выполняется 100000 * 100000 раз.

В Eclipse используйте представление отладки, чтобы узнать, остановлена ​​или продолжает работать программа.

+0

консоль, вверху говорит «Завершена», которая отображается только после остановки программы. – Roclemir

+0

@wero протестировал его, программа завершается – Paul

+0

@Paul Я тоже, но, похоже, у вас было больше терпения ... – wero

3

Программа работает нормально. Для консоли Eclipse слишком много выходных данных. Если вы запустите его из командной строки и перенаправите вывод в файл> output.txt, вывод будет отображаться правильно.

Вы также можете увидеть часть вывода в Eclipse, заменяющую System.out.Println с StringBuilder прилагая весь вывод, как показано ниже

StringBuilder sb = new StringBuilder(2048); 
    sb.append("Array created\n"); 

    sb.append("Sorting started"); 
    for (int i = 0; i < numbers.length; i++) { 
     for (int j = i; j < numbers.length; j++) { 
      if (numbers[j] < numbers[i]) { 
       int temp = numbers[i]; 
       numbers[i] = numbers[j]; 
       numbers[j] = temp; 
      } 
     } 
    } 
    sb.append("Finished the sort\n"); 
    for (int i = 0; i < numbers.length; i++) { 
     sb.append(numbers[i]); 
     sb.append(", "); 
    } 
    System.out.println(sb); 

В качестве альтернативы в консоли Eclipse, щелкните правой кнопкой мыши, Свойства, Флажок Limit Console Output непроверить (установлен по умолчанию) и все ваши вывода будут отображаться в Eclipse.

enter image description here

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