2016-03-18 12 views
0

Ich schrieb ein Programm, das einige Ganzzahlen in einem linkedlist speichert und es auch die Zeit durchläuft die Liste mit Iteratoren und get(index), ich bin 100% sicher von meinem Programm, aber wenn ich das Programm es gibt mir dieser Fehler:Iteratoren auf LinkedList Time Traversing

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)

Unten finden Sie meinen Code. Ich brauche Hilfe bitte

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

Sie erhalten 1s, 2s und 3s durcheinander. Überprüfen Sie Ihr Programm sehr sorgfältig. –

+1

Sagen Sie uns zumindest, was die relevante Zeile ist ... – bcsb1001

+0

Wie Paul sagte, Sie werden mit doppeltem Code durcheinander gebracht. Wiederverwendeter Code gehört zu einer Methode. Schreibe das Zeug zwischen deinen ///// Zeilen als eine Methode mit der Signatur long getIterationTime (int count) – LinuxDisciple

Antwort

5

Das Problem in ist

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

Indizes sind von 0 bis Größe - 1. Wenn i ist gleich zu n1 Sie erhalten IndexOutOfBoundsException als der maximale Index der Liste n1 - 1 ist. Ändern Sie ihn auf

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

Das Gleiche gilt für list2 und list3.

Zusätzlich, wie @Paul Boddington erwähnt, fügen Sie nie etwas zu list3 hinzu, aber Sie fügen Werte zweimal zu list2 ein.

+0

Außerdem wird nichts zu "list3" hinzugefügt. –