时间集合类排序和时间制作arraylist

时间:2013-12-02 16:37:45

标签: java sorting collections arraylist timing

这是我编写的代码,用于执行选择排序所需的时间:

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

2 个答案:

答案 0 :(得分:0)

为什么你不能只使用这样的东西,

  

startTime = System.currentTimeMillis();

     

Collections.sort(数组列表);

     

stopTime = System.currentTimeMillis();

与上面使用的相同。

答案 1 :(得分:0)

您需要区分“不起作用”和“不会产生有意义的结果”。

您的wordList字符串数组似乎不足以发现时差。

两个建议:

  1. 使用更大的数组进行测试:数十万字(请参阅底部的测试代码)

  2. 使用System.nanoTime()可以产生更好的精度(请参阅下面的说明)。

  3. 来自David Holmes' Weblog

      

    绝对的“时间”时钟由表示   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);
    
        }
    
    }