package listvergleich1;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

/**
 * Vergleicht die Geschwindigkeiten einer ArrayList und einer LinkedList.
 * Achtung: Die Werte sind verfaelscht, da oft auf einen index zugegriffen wird, was ja bei der LinkedList laenger dauert.
 * 
 * @author Ralf Kunze (rkunze@uos.de), Institut fuer Informatik, Universitaet
 *         Osnabrueck
 * @date 18.05.2007
 */
public class ListenVergleichsTest {

	public static void main(String[] args) {
		
		long zeit = 0;
		final int MAXVALUES = 50000;
		
		List<Integer> l = new ArrayList<Integer>();
		
		zeit = System.currentTimeMillis();
		for (int i = 0; i < MAXVALUES; i++) {
			l.add((int) (Math.random() * MAXVALUES));
		}
		System.out.printf(
				"ArrayList: Das Einfuegen der Reihe nach hat %d Millisekunden gedauert.%n",
				System.currentTimeMillis() - zeit);

		l = new ArrayList<Integer>();
		zeit = System.currentTimeMillis();
		for (int i = 0; i < MAXVALUES; i++) {
			l.add((int)(Math.random() * i), (int) (Math.random() * 1000));
		}
		System.out.printf(
				"ArrayList: Das Einfuegen an beliebigen Stellen hat %d Millisekunden gedauert.%n",
				System.currentTimeMillis() - zeit);

		
		zeit = System.currentTimeMillis();
		for (int i = 0; i < MAXVALUES; i++) {
			l.get((int) (Math.random() * MAXVALUES));
		}
		System.out.printf(
				"ArrayList: Das Auslesen an beliebigen Stellen hat %d Millisekunden gedauert.%n",
				System.currentTimeMillis() - zeit);

		Iterator<Integer> iterator = l.iterator();
		zeit = System.currentTimeMillis();
//		for (int i = 0; i < MAXVALUES; i++) {
//			l.remove((int) (Math.random() * (MAXVALUES - i)));
//		}
		
		while (iterator.hasNext()) {
			iterator.next();
			iterator.remove();
		}
		System.out.printf(
				"ArrayList: Das Loeschen der Reihe nach hat %d Millisekunden gedauert.%n",
				System.currentTimeMillis() - zeit);

		// ////////////

		l = new LinkedList<Integer>();
		zeit = System.currentTimeMillis();
		for (int i = 0; i < MAXVALUES; i++) {
			l.add((int) (Math.random() * MAXVALUES));
		}
		System.out.printf(
				"LinkedList: Das Einfuegen der Reihe nach hat %d Millisekunden gedauert.%n",
				System.currentTimeMillis() - zeit);

		l = new LinkedList<Integer>();
		zeit = System.currentTimeMillis();
		for (int i = 0; i < MAXVALUES; i++) {
			l.add((int)(Math.random() * i), (int) (Math.random() * MAXVALUES));
		}
		System.out.printf(
				"LinkedList: Das Einfuegen an beliebigen Stellen hat %d Millisekunden gedauert.%n",
				System.currentTimeMillis() - zeit);
		
		zeit = System.currentTimeMillis();
		for (int i = 0; i < MAXVALUES; i++) {
			l.get((int) (Math.random() * MAXVALUES));
		}
		System.out.printf(
				"LinkedList: Das Auslesen an beliebigen Stellen hat %d Millisekunden gedauert.%n",
				System.currentTimeMillis() - zeit);

		
		iterator = l.iterator();
		zeit = System.currentTimeMillis();
//		for (int i = 0; i < MAXVALUES; i++) {
//			l.remove((int) (Math.random() * (MAXVALUES - i)));
//		}

		
		while (iterator.hasNext()) {
			iterator.next();
			iterator.remove();
		}
		System.out.printf(
				"LinkedList: Das Loeschen der Reihe nach  hat %d Millisekunden gedauert.%n",
				System.currentTimeMillis() - zeit);
	}

}
