// -----------------------------------------------------------------------------

// LinkedListExample3.java

// source: revised from http://www.idevelopment.info/data/Programming/java/collections/LinkedListExample.java

// -----------------------------------------------------------------------------

 

/*

 * =============================================================================

 * Copyright (c) 1998-2009 Jeffrey M. Hunter. All rights reserved.

 *

 * All source code and material located at the Internet address of

 * http://www.idevelopment.info is the copyright of Jeffrey M. Hunter and

 * is protected under copyright laws of the United States. This source code may

 * not be hosted on any other site without my express, prior, written

 * permission. Application to host any of the material elsewhere can be made by

 * contacting me at jhunter@idevelopment.info.

 *

 * I have made every effort and taken great care in making sure that the source

 * code and other content included on my web site is technically accurate, but I

 * disclaim any and all responsibility for any loss, damage or destruction of

 * data or any other property which may arise from relying on it. I will in no

 * case be liable for any monetary damages arising from such loss, damage or

 * destruction.

 *

 * As with any code, ensure to test this code in a development environment

 * before attempting to run it in production.

 * =============================================================================

 */

 

import java.util.List;

import java.util.LinkedList;

import java.util.Iterator;

import java.util.ListIterator;

import java.util.Collections;

import java.util.Random;

 

/**

 * -----------------------------------------------------------------------------

 * The following class provides an example of storing and retrieving objects

 * from a LinkedList.

 *

 * A List corresponds to an "ordered" group of elements where duplicates are

 * allowed.

 *

 * A LinkedList is based on a double linked list where elements of the List are

 * typically accessed through add() and remove() methods.

 *

 * LinkedList's give great performance on add() and remove() methods, but do not

 * perform well on get() and set() methods when compared to an ArrayList.

 *

 * @version 1.0

 * @author  Jeffrey M. Hunter  (jhunter@idevelopment.info)

 * @author  http://www.idevelopment.info

 * -----------------------------------------------------------------------------

 */

 

public class LinkedListExample3 {

 

    /**

     * Provides an example of how to work with the LinkedList container.

     */

    public void doLinkedListExample() {

 

        final int MAX = 3;

        int counter = 0;

 

        System.out.println("+---------------------------------------------------------------------+");

        System.out.println("| Create/Store objects in an LinkedList container.                    |");

        System.out.println("+---------------------------------------------------------------------+");

        System.out.println();

 

        List listA = new LinkedList();

        List listB = new LinkedList();

 

        for (int i = 0; i < MAX; i++) {

            System.out.println("  - Storing Integer(" + i + ")");

            listA.add(new Integer(i));

        }

 

        System.out.println("  - Storing String(Alex)");

        listA.add("Alex");

 

        System.out.println("  - Storing String(Melody)");

        listA.add("Melody");

 

        System.out.println();

        System.out.println("+---------------------------------------------------------------------+");

        System.out.println("| Retrieve objects in an LinkedList container using an Iterator.      |");

        System.out.println("+---------------------------------------------------------------------+");

        System.out.println();

 

        Iterator i = listA.iterator();

        while (i.hasNext()) {

            System.out.println(i.next());

        }

 

 

        System.out.println();

        System.out.println("+---------------------------------------------------------------------+");

        System.out.println("| Retrieve objects in an LinkedList container using a ListIterator.   |");

        System.out.println("+---------------------------------------------------------------------+");

        System.out.println();

 

        counter = 0;

        ListIterator li = listA.listIterator();

            System.out.println("Element [" + counter + "] = " + li);

            System.out.println("  - hasPrevious    = " + li.hasPrevious());

            System.out.println("  - hasNext        = " + li.hasNext());

            System.out.println("  - previousIndex  = " + li.previousIndex());

            System.out.println("  - nextIndex      = " + li.nextIndex());

 

        while (li.hasNext()) {

            System.out.println("Element [" + counter + "] = " + li.next());

            System.out.println("  - hasPrevious    = " + li.hasPrevious());

            System.out.println("  - hasNext        = " + li.hasNext());

            System.out.println("  - previousIndex  = " + li.previousIndex());

            System.out.println("  - nextIndex      = " + li.nextIndex());

            System.out.println();

            counter++;

        }

 

 

        System.out.println();

        System.out.println("+---------------------------------------------------------------------+");

        System.out.println("| Retrieve objects in an LinkedList container using index.            |");

        System.out.println("+---------------------------------------------------------------------+");

        System.out.println();

 

        for (int j=0; j < listA.size(); j++) {

            System.out.println("[" + j + "] - " + listA.get(j));

        }

 

 

        System.out.println();

        System.out.println("+---------------------------------------------------------------------+");

        System.out.println("| Search for a particular Object and return its index location.       |");

        System.out.println("+---------------------------------------------------------------------+");

        System.out.println();

 

        int locationIndex = listA.indexOf("Jeff");

        System.out.println("Index location of the String \"Jeff\" is: " + locationIndex); 

 

 

        System.out.println();

        System.out.println("+---------------------------------------------------------------------+");

        System.out.println("| Search for an object and return the first and last (highest) index. |");

        System.out.println("+---------------------------------------------------------------------+");

        System.out.println();

 

        System.out.println("First occurance search for String \"Alex\".  Index =  " + listA.indexOf("Alex"));

        System.out.println("Last Index search for String \"Alex\".       Index =  " + listA.lastIndexOf("Alex"));

 

 

        System.out.println();

        System.out.println("+---------------------------------------------------------------------+");

        System.out.println("| Extract a sublist from the main list, then print the new List.      |");

        System.out.println("+---------------------------------------------------------------------+");

        System.out.println();

 

        List listSub = listA.subList(10, listA.size());

        System.out.println("New Sub-List from index 10 to " + listA.size() + ": " + listSub);

 

 

        System.out.println();

        System.out.println("+---------------------------------------------------------------------+");

        System.out.println("| Sort the Sub-List created above.                                    |");

        System.out.println("+---------------------------------------------------------------------+");

        System.out.println();

 

        System.out.println("Original List   : " + listSub);

        Collections.sort(listSub);

        System.out.println("New Sorted List : " + listSub);

        System.out.println();

 

 

        System.out.println();

        System.out.println("+---------------------------------------------------------------------+");

        System.out.println("| Reverse the Sub-List created above.                                 |");

        System.out.println("+---------------------------------------------------------------------+");

        System.out.println();

 

        System.out.println("Original List     : " + listSub);

        Collections.reverse(listSub);

        System.out.println("New Reversed List : " + listSub);

        System.out.println();

 

 

        System.out.println();

        System.out.println("+---------------------------------------------------------------------+");

        System.out.println("| Check to see if the Lists are empty.                                |");

        System.out.println("+---------------------------------------------------------------------+");

        System.out.println();

 

        System.out.println("Is List A empty?   " + listA.isEmpty());

        System.out.println("Is List B empty?   " + listB.isEmpty());

        System.out.println("Is Sub-List empty? " + listSub.isEmpty());

 

 

        System.out.println();

        System.out.println("+---------------------------------------------------------------------+");

        System.out.println("| Clone the initial List.                                             |");

        System.out.println("| NOTE: The contents of the List are object references, so both       |");

        System.out.println("|       of the List's contain the same exact object reference's.      |");

        System.out.println("+---------------------------------------------------------------------+");

        System.out.println();

 

        System.out.println("List A   (before) : " + listA);

        System.out.println("List B   (before) : " + listB);

        System.out.println("Sub-List (before) : " + listSub);

        System.out.println();

        System.out.println("Are List's A and B equal? " + listA.equals(listB));

        System.out.println();

        listB = new LinkedList(listA);

        System.out.println("List A   (after)  : " + listA);

        System.out.println("List B   (after)  : " + listB);

        System.out.println("Sub-List (after)  : " + listSub);

        System.out.println();

        System.out.println("Are List's A and B equal? " + listA.equals(listB));

 

 

        System.out.println();

        System.out.println("+---------------------------------------------------------------------+");

        System.out.println("| Shuffle the elements around in some Random order for List A.        |");

        System.out.println("+---------------------------------------------------------------------+");

        System.out.println();

 

        System.out.println("List A   (before) : " + listA);

        System.out.println("List B   (before) : " + listB);

        System.out.println("Sub-List (before) : " + listSub);

        System.out.println();

        System.out.println("Are List's A and B equal? " + listA.equals(listB));

        System.out.println();

        Collections.shuffle(listA, new Random());

        System.out.println("List A   (after)  : " + listA);

        System.out.println("List B   (after)  : " + listB);

        System.out.println("Sub-List (after)  : " + listSub);

        System.out.println();

        System.out.println("Are List's A and B equal? " + listA.equals(listB));

 

 

        System.out.println();

        System.out.println("+---------------------------------------------------------------------+");

        System.out.println("| Convert a List to an Array.                                         |");

        System.out.println("+---------------------------------------------------------------------+");

        System.out.println();

 

        Object[] objArray = listA.toArray();

        for (int j=0; j < objArray.length; j++) {

            System.out.println("Array Element [" + j + "] = " + objArray[j]);

        }

 

 

        System.out.println();

        System.out.println("+---------------------------------------------------------------------+");

        System.out.println("| Remove (clear) Elements from List A.                                |");

        System.out.println("+---------------------------------------------------------------------+");

        System.out.println();

 

        System.out.println("List A   (before) : " + listA);

        System.out.println("List B   (before) : " + listB);

        System.out.println();

        listA.clear();

        System.out.println("List A   (after)  : " + listA);

        System.out.println("List B   (after)  : " + listB);

        System.out.println();

 

    }

 

 

    /**

     * Sole entry point to the class and application.

     * @param args Array of String arguments.

     */

    public static void main(String[] args) {

        LinkedListExample3 listExample = new LinkedListExample3();

        listExample.doLinkedListExample();

    }

 

}