import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;


public class ListDemo {
  public static void main(String[] args) {
    int n = 10;
    if (args.length == 1) {
      n = Integer.parseInt(args[0]);
    }

    String[] names = {"Seth", "Phil", "Sam", "Fabio", "Bobo", "Tom"};

    List<String> ds = new ArrayList<>();
    for (String s : names) {
      ds.add(0, s);
    }
    System.out.println(ds);

    ds.add(3, "Nate");
    System.out.println(ds);

    ds.remove(2);
    System.out.println(ds);

    ds.set(2, "Harry");
    System.out.println(ds);

    // for (String s: ds) {
    //   System.out.println(s);
    // }

    long start, stop;
    double elapsed;

    List<Integer> ds2 = new LinkedList<>();

    System.out.print("Adding " + n + " values...");
    System.out.flush();
    start = System.nanoTime();
    for (int i = 0; i < n; i++) {
      ds2.add(2*i);
    }
    stop = System.nanoTime();
    elapsed = ((double)stop-start)*1e-9;
    System.out.println("done (" + elapsed + "s)");

    ds2.clear();
    System.out.print("Adding " + n + " values at the front...");
    System.out.flush();
    start = System.nanoTime();
    for (int i = 0; i < n; i++) {
      ds2.add(0, 2*i);
    }
    stop = System.nanoTime();
    elapsed = ((double)stop-start)*1e-9;
    System.out.println("done (" + elapsed + "s)");

    System.out.print("Using " + 2*n + " calls to contains()...");
    System.out.flush();
    start = System.nanoTime();
    for (int i = 0; i < 2*n; i++) {
      ds2.contains(i);
    }
    stop = System.nanoTime();
    elapsed = ((double)stop-start)*1e-9;
    System.out.println("done (" + elapsed + "s)");


  }

}
