我有一个非常简单的程序,可以选择排序100000个数字所需的时间。 这是代码:
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]);
}
}
}
这会运行,打印&#34; Array Created&#34;和&#34;排序已开始&#34;到控制台,一两秒钟,然后停止。没有错误或警告。不打印&#34;完成排序&#34;或类似的东西。 它应该打印&#34;完成排序&#34;,然后从watch.getElapsedTime()返回的时间(StopWatching类的对象,其工作,已在其他环境中测试)。
任何人都能说出我在这里做错了吗?
注意:watch.getElapsedTime()的返回类型是Long,它是从创建监视时到调用watch.stop()方法时计算的时间(以毫秒为单位)。<使用GregorianCalendar类。 / p>
P.S。我正在使用eclipse IDE
答案 0 :(得分:5)
问题是Eclipse的GUI控制台输出。
代码
for (int i = 0; i < numbers.length; i++) {
System.out.print(numbers[i]);
}
在一行中打印100000个数字。
在OS控制台中使用java
运行时没有问题。
但是当在Eclipse中完成时,控制台只关闭一个以前的打印输出。
这是我第一次尝试分析:
我猜程序没有停止但仍在运行。循环的内部执行100000 * 100000次。
在Eclipse中使用调试视图来查看程序是否已停止或仍在运行。
答案 1 :(得分:3)
程序运行正常。 Eclipse控制台显示的输出太多了。 如果从命令行运行它并将输出重定向到文件&gt; 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控制台中,右键单击“属性”,“复选框限制控制台输出”以取消选中(默认选中),所有输出都将显示在Eclipse中。
答案 2 :(得分: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转换。