这是我编写的代码,用于执行选择排序所需的时间:
static public String [ ] selectionSort(String [ ] wordlist)
{
for (int i = 1; i < wordlist.length; i++)
{
int s = i-1;
for (int j = i; j < wordlist.length; j++)
{
if (wordlist[j].compareTo(wordlist[s]) < 0)
{
s = j;
}
}
String temp = wordlist[i-1];
wordlist[i-1] = wordlist[s];
wordlist[s] = temp;
}
return wordlist;
}
static public String [ ] timedSelectionSort(String [ ] wordlist)
{
long startTime = 0;
long stopTime = 0;
long elapsedMillis = 0;
long elapsedSec = 0;
long elapsedMin = 0;
startTime = System.currentTimeMillis();
wordlist = selectionSort(wordlist);
stopTime = System.currentTimeMillis();
elapsedMillis = stopTime-startTime;
elapsedSec = elapsedMillis/1000;
elapsedMin = elapsedMillis/60000;
System.out.printf("File reading took %d minutes and %s secs and %d milliseconds to execute\n",
elapsedMin,elapsedSec%60, elapsedMillis%1000);
System.out.println("Read " + wordlist.length + " strings.");
return wordlist;
}
我还要花时间制作一个包含数组中所有字符串的arraylist对象需要多长时间(我的尝试在下面)
static public ArrayList<String> makeArrayListClassObject(String [ ] wordlist)
{
long startTime = 0;
long stopTime = 0;
long elapsedMillis = 0;
long elapsedSec = 0;
long elapsedMin = 0;
startTime = System.currentTimeMillis();
ArrayList<String> stringList = new ArrayList<String>(Arrays.asList(wordlist));
stopTime = System.currentTimeMillis();
elapsedMillis = stopTime-startTime;
elapsedSec = elapsedMillis/1000;
elapsedMin = elapsedMillis/60000;
System.out.printf("File reading took %d minutes and %s secs and %d milliseconds to execute\n",
elapsedMin,elapsedSec%60, elapsedMillis%1000);
System.out.println("Read " + wordlist.length + " strings.");
return stringList;
}
以及使用Collections.sort()方法对arraylist对象进行排序所需的时间。我已经制定了这种方法(见下文),但我不知道如何计时
static public void collectionsClassSort(ArrayList<String> arraylist)
{
Collections.sort(arraylist);
}
我想我的问题是: 1.有没有办法使用相同的方法来计算这两种方法的时间,就像我计算第一种方法一样? 2.如果没有,我该如何计算这两种方法?
编辑:定时集合排序现在有效,但是arraylist的定时构建仍然没有。意味着计时器表示该方法需要0分钟,0秒和0毫秒才能执行
这是更新的代码:
static public ArrayList<String> makeArrayListClassObject(String [ ] wordlist)
{
long startTime = 0;
long stopTime = 0;
long elapsedMillis = 0;
long elapsedSec = 0;
long elapsedMin = 0;
startTime = System.currentTimeMillis();
ArrayList<String> stringList = new ArrayList<String>(Arrays.asList(wordlist));
stopTime = System.currentTimeMillis();
elapsedMillis = stopTime-startTime;
elapsedSec = elapsedMillis/1000;
elapsedMin = elapsedMillis/60000;
System.out.printf("File reading took %d minutes and %s secs and %d milliseconds to execute\n",
elapsedMin,elapsedSec%60, elapsedMillis%1000);
return stringList;
}
答案 0 :(得分:0)
为什么你不能只使用这样的东西,
startTime = System.currentTimeMillis();
Collections.sort(数组列表);
stopTime = System.currentTimeMillis();
与上面使用的相同。
答案 1 :(得分:0)
您需要区分“不起作用”和“不会产生有意义的结果”。
您的wordList
字符串数组似乎不足以发现时差。
两个建议:
使用更大的数组进行测试:数十万字(请参阅底部的测试代码)
使用System.nanoTime()可以产生更好的精度(请参阅下面的说明)。
绝对的“时间”时钟由表示 System.currentTimeMillis()方法,返回毫秒 自纪元以来以毫秒为单位的挂钟时间的表示。如 它使用操作系统的“时间”时钟。更新 此时钟的分辨率通常与定时器中断相同(例如, 10ms),但在某些系统上是固定的,与中断无关 率。
相对时间时钟由System.nanoTime()方法表示 返回“自由运行”时间,以纳秒为单位。这个时间很有用 仅用于与其他nanoTime值进行比较。 nanoTime方法 使用平台上可用的最高分辨率时钟,同时 它的返回值以纳秒为单位,通常是更新分辨率 只有几微秒。但是,在某些系统上,别无选择 使用与currentTimeMillis()相同的时钟源 - 幸运的是 这种情况很少见,主要影响旧的Linux系统和Windows 98。
您应该始终尝试使用nanoTime进行计时测量或 计算(是的,有JDK API没有这样做),在 希望它的分辨率比currentTimeMillis好。
以下代码在我的系统上生成了“2
”:
import java.util.*;
public class ArrayTime {
public static void main(String[] args) {
String[] wordList = new String [600000];
for(int i=0; i<wordList.length; ++i)
wordList[i] = "" + i;
long start = System.currentTimeMillis();
ArrayList<String> stringList = new ArrayList<String>(Arrays.asList(wordList));
long elapsedTime = System.currentTimeMillis() - start;
System.out.println(elapsedTime);
}
}