import java.util.*;
import java.io.*;
import javax.swing.*;
import javax.swing.filechooser.*;
public class ArrayListDemo {
   /**
	 * use a dialog box to select a text file (.txt)
	 * @return a Scanner for the selected file, or null if cancel selected
	 */
   public static Scanner selectTextFile() {
	   do {
	      JFileChooser chooser = new JFileChooser();
         FileNameExtensionFilter filter = new FileNameExtensionFilter(
            "Text files", "txt");
         chooser.setFileFilter(filter);
         int returnVal = chooser.showOpenDialog(null);
			try {
            if(returnVal == JFileChooser.APPROVE_OPTION) {
		         return new Scanner(chooser.getSelectedFile());
            } 
   		   else {
		         return null;
			   }
			}
			catch (FileNotFoundException e) {
			   JOptionPane.showMessageDialog(null, "Invalid file!",
				   "error", JOptionPane.ERROR_MESSAGE); 
			}
		} while (true);
	}
   /**
	 * read integers from Scanner into an ArrayList
	 * @param scanner file to read from
	 * @return an ArrayList holding all of the integers
	 */
	public static ArrayList<Integer> readIntegers(Scanner scanner) {
	   ArrayList<Integer> result = new ArrayList<Integer>();
	   while (scanner.hasNextInt()) {
		   result.add(scanner.nextInt());
		}
		return result;
	}
	/**
	 * reverse the order of the ArrayList
	 * @param list ArrayList to be reversed
	 */
	public static void reverse(ArrayList<Integer> list) {
      // walk through the first half of the list
		for (int i=0; i<(list.size()-1)/2; i++) {
		   // swap each element with its counterpart
			// in the second half
		   int temp = list.get(i);
			list.set(i, list.get(list.size()-i-1));
			list.set(list.size()-i-1, temp);
		}	   
	}
	/**
	 * print all of the numbers in the ArrayList
	 * @param list ArrayList to be printed
	 */
	public static void print(ArrayList<Integer> list) {
		for (int i=0; i<list.size(); i++) {
		   Integer value = list.get(i);
		   System.out.println(value);
		}
	}
	/**
	 * print all of the numbers in the ArrayList
	 * @param list ArrayList to be printed
	 */
	public static void alternatePrint(ArrayList<Integer> list) {
		for (Integer value : list) {
		   System.out.println(value);
		}
	}
	
   public static void main(String[] args) {
	   // select a file
	   Scanner scanner = ArrayListDemo.selectTextFile();
		// read all the numbers from the file
		ArrayList<Integer> ints = ArrayListDemo.readIntegers(scanner);
		// reverse the order of the list
		ArrayListDemo.reverse(ints);
		// print out the numbers
		System.out.println("Reverse order");
		ArrayListDemo.print(ints);
		// sort the numbers
		Collections.sort(ints);
		// print out the sorted numbers
		System.out.println("Sorted order");
		ArrayListDemo.alternatePrint(ints);
	}
}