2016-03-18 150 views
0

我寫了一個程序,它存儲了一些整數在linkedlist,它也用迭代器和get(index)測試了遍歷列表的時間,我100%確定我的程序,但是當我運行它的程序時我這個錯誤:LinkedList時間遍歷的迭代器

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 20000, Size: 20000 at java.util.LinkedList.checkElementIndex(LinkedList.java:555) at java.util.LinkedList.get(LinkedList.java:476) at Homework2.MyLinkedList.main(MyLinkedList.java:72)

下面你可以找到我的代碼。我需要幫助,請

import java.util.LinkedList; 
import java.util.ListIterator; 
import java.util.Scanner; 

public class MyLinkedList { 
    public static void main(String[] args) { 

    Scanner in = new Scanner(System.in); 

    // System.out.print("Enter the size of your list: "); 
    // int size = in.nextInt(); 

    int n1 = 20000; 
    int n2 = 200000; 
    int n3 = 2000000; 

    LinkedList <Integer> list1 = new LinkedList(); 

    for (int i = 1; i <= n1; i++) { 
     list1.add(i); 
    } 

    long t1Start = System.currentTimeMillis(); 
    ListIterator <Integer> iterator1 = list1.listIterator(); 
    while (iterator1.hasNext()) { 
     iterator1.next(); 
    } 
    long t1Stop = System.currentTimeMillis(); 

    long t1Final = t1Stop - t1Start; 

    ////////////////////////////////////////// 

    LinkedList <Integer> list2 = new LinkedList(); 

    for (int i = 1; i <= n2; i++) { 
     list2.add(i); 
    } 

    long t2Start = System.currentTimeMillis(); 
    ListIterator <Integer> iterator2 = list1.listIterator(); 
    while (iterator1.hasNext()) { 
     iterator1.next(); 
    } 
    long t2Stop = System.currentTimeMillis(); 

    long t2Final = t2Stop - t2Start; 

    ////////////////////////////////////////// 

    LinkedList <Integer> list3 = new LinkedList(); 

    for (int i = 1; i <= n2; i++) { 
     list2.add(i); 
    } 

    long t3Start = System.currentTimeMillis(); 
    ListIterator <Integer> iterator3 = list1.listIterator(); 
    while (iterator1.hasNext()) { 
     iterator1.next(); 
    } 
    long t3Stop = System.currentTimeMillis(); 

    long t3Final = t3Stop - t3Start; 

    ////////////////////////////////////////// 

    long get1Start = System.currentTimeMillis(); 
    for (int i = 1; i <= n1; i++) { 
     list1.get(i); 
    } 
    long get1Stop = System.currentTimeMillis(); 
    long get1Final = get1Stop - get1Start; 

    ////////////////////////////////////////// 

    long get2Start = System.currentTimeMillis(); 
    for (int i = 1; i <= n2; i++) { 
     list2.get(i); 
    } 
    long get2Stop = System.currentTimeMillis(); 
    long get2Final = get2Stop - get2Start; 

    ////////////////////////////////////////// 

    long get3Start = System.currentTimeMillis(); 
    for (int i = 1; i <= n3; i++) { 
     list3.get(i); 
    } 
    long get3Stop = System.currentTimeMillis(); 
    long get3Final = get3Stop - get3Start; 

    ////////////////////////////////////////// 

    System.out.println("n\t\titerator,seconds\t\tget(index),seconds"); 
    System.out.println(n1 + "\t\t" + t1Final + "\t\t" + get1Final); 
    System.out.println(n2 + "\t\t" + t2Final + "\t\t" + get2Final); 
    System.out.println(n3 + "\t\t" + t3Final + "\t\t" + get3Final); 

    } 
} 
+2

你得到1s,2s和3s混在一起。仔細檢查你的程序。 –

+1

至少告訴我們相關的線路是什麼...... – bcsb1001

+0

就像Paul說的,你會混淆重複的代碼。重用代碼屬於一種方法。重寫你的/////行之間的東西作爲一個方法與簽名long getIterationTime(int count) – LinuxDisciple

回答

5

的問題是在

for (int i = 1; i <= n1; i++) { 
    list1.get(i); 
} 

指數是從0到大小 - 1。當i是等於n1IndexOutOfBoundsException作爲列表的最大指數爲n1 - 1。將其更改爲

for (int i = 0; i < n1; i++) { 
    list1.get(i); 
} 

也是一樣list2list3

此外,正如@Paul Boddington所提到的,您從不向list3添加任何內容,但是您可以將值插入list2兩次。

+0

此外,沒有什麼會被添加到'list3'。 –