tterrag1098

Untitled

Nov 20th, 2018
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package nl.ru.ai.exercise1;
  2. //
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.util.ArrayList;
  6. import java.util.Scanner;
  7.  
  8.  
  9. public class Exercise1
  10. {
  11.   private static final String DATABASE_FILENAME="songs.txt";
  12.   public static int counter=0;
  13.  
  14.   /*
  15.    * Here we go
  16.    */
  17.   public static void main(String[] args)
  18.   {
  19.     try
  20.     {
  21.      
  22.       ArrayList<Track> list=new ArrayList<Track>();
  23.      
  24.       System.out.println(list);
  25.       /*
  26.        * Read database
  27.        */
  28.       readDatabase(list);
  29.       System.out.printf("%d songs read from datatabase '%s'\n",list.size(),DATABASE_FILENAME);
  30.       /*
  31.        * Ask for sorting method
  32.        */
  33.       Scanner input=new Scanner(System.in);
  34.       SortingMethod method=askForSortingMethod(input);
  35.       /*
  36.        * Sort
  37.        */
  38.       System.out.printf("Sorting with %s\n",method);
  39.       switch(method)
  40.       {
  41.         case BUBBLE_SORT:
  42.           bubbleSort(list);
  43.           break;
  44.         case INSERTION_SORT:
  45.           insertionSort(list);
  46.           break;
  47.         case SELECTION_SORT:
  48.           selectionSort(list);
  49.           break;
  50.       }
  51.       System.out.println("Sorted!");
  52.       /*
  53.        * Show result
  54.        */
  55.       dumpDatabase(list, counter);
  56.     }
  57.     catch(FileNotFoundException exception)
  58.     {
  59.       System.out.printf("Error opening database file '%s': file not found\n",DATABASE_FILENAME);
  60.     }
  61.   }
  62.   private static void dumpDatabase(ArrayList<Track> list, int counter)
  63.   {
  64.     for(int i=0;i<list.size();i++)
  65.     {
  66.       System.out.printf("%-26s %-32s %4d %s\n",list.get(i).artist,list.get(i).cd,list.get(i).track, list.get(i).time);
  67.       System.out.println(counter);
  68.     }
  69.   }
  70.   /**
  71.    * Ask the user for a sorting method
  72.    * @param input scanner used for asking
  73.    * @return sorting method
  74.    */
  75.   private static SortingMethod askForSortingMethod(Scanner input)
  76.   {
  77.     /*
  78.      * Show possible sorting methods
  79.      */
  80.     for(SortingMethod method : SortingMethod.values())
  81.       System.out.printf("%d : %s\n",method.ordinal(),method);
  82.     /*
  83.      * Loop until valid choice
  84.      */
  85.     SortingMethod choice=null;
  86.     while(choice==null)
  87.     {
  88.       System.out.println("Enter choice: ");
  89.       int selection=input.nextInt();
  90.       if(selection>=0&&selection<SortingMethod.values().length)
  91.         choice=SortingMethod.values()[selection];
  92.       else
  93.         System.out.println("Invalid choice, try again!");
  94.     }
  95.     return choice;
  96.   }
  97.   /**
  98.    * Reads the cd database from the file 'songs.txt' into the specified track array
  99.    * @param database this is the database that will be filled with the input.
  100.    * @return number of tracks read
  101.    * @throws FileNotFoundException
  102.    */
  103.   static int readDatabase(ArrayList<Track> list) throws FileNotFoundException
  104.   {
  105.     FileInputStream inputStream=new FileInputStream(DATABASE_FILENAME);
  106.     Scanner scanner=new Scanner(inputStream);
  107.     int numberOfTracks=0;
  108.     while(scanner.hasNext())
  109.     {
  110.       Track track=new Track();
  111.       track.artist=scanner.nextLine();
  112.       track.cd=scanner.nextLine();
  113.       track.year=scanner.nextInt();
  114.       scanner.nextLine();
  115.       track.track=scanner.nextInt();
  116.       scanner.nextLine();
  117.       track.title=scanner.nextLine();
  118.       track.tags=scanner.nextLine();
  119.       track.time=new Length(scanner.nextLine());
  120.       track.country=scanner.nextLine();
  121.       list.add(track);
  122.       numberOfTracks++;
  123.     }
  124.     scanner.close();
  125.     return numberOfTracks;
  126.   }
  127.   /*************** Auxiliary array routines from lecture ***************/
  128.   /**
  129.    * Checks if the slice of the specified array is sorted
  130.    * @param array
  131.    * @param slice
  132.    * @return true if the slice of the array is in ascending order, false otherwise
  133.    */
  134.   static <T extends Comparable<T>> boolean isSorted(ArrayList<T> list, Slice slice)
  135.   {
  136.     assert list!=null : "ArrayList should be initialized";
  137.     assert slice.isValid() : "Slice should be valid";
  138.     for(int i=slice.from;i<slice.upto-1;i++)
  139.       if(list.get(i).compareTo(list.get(i+1))>0)
  140.         return false;
  141.     return true;
  142.   }
  143.   /**
  144.    * Find position in array slice where to insert new element
  145.    * @param array
  146.    * @param slice
  147.    * @param y element for which the position should be returned
  148.    * @return position where to insert
  149.    */
  150.   static <T extends Comparable<T>> int findInsertPosition(ArrayList<T> list, Slice slice, T y)
  151.   {
  152.     assert list!=null : "ArrayList should be initialized";
  153.     assert slice.isValid() : "Slice should be valid";
  154.     assert isSorted(list,slice);
  155.     for(int i=slice.from;i<slice.upto;i++)
  156.       if(list.get(i).compareTo(y)>=0)
  157.         return i;
  158.     return slice.upto;
  159.   }
  160.   /**
  161.    * Shifts all elements in the slice one position to the right
  162.    * @param array
  163.    * @param slice
  164.    */
  165.   static <T extends Comparable<T>> void shiftRight(ArrayList<T> list, Slice slice)
  166.   {
  167.     assert list!=null : "ArrayList should be initialized";
  168.     assert slice.isValid()&&slice.from<list.size() : "Slice should be valid";
  169.     for(int i=slice.upto;i>slice.from;i--)
  170.       list.set(i,list.get(i-1));
  171.   }
  172.   /**
  173.    * Insert an element to a sorted array and keep it sorted
  174.    * @param array
  175.    * @param length length
  176.    * @param y element to be added
  177.    * @return new length
  178.    */
  179.   static <T extends Comparable<T>> int insert(ArrayList<T> list, int i, T y)
  180.   {
  181.     assert list!=null : "ArrayList should be initialized";
  182.     assert list.size()>=0 : "Length cannot be negative";
  183.     assert isSorted(list,new Slice(0,i)) : "Array should be sorted";
  184.     int position=findInsertPosition(list,new Slice(0,i),y);
  185.     shiftRight(list,new Slice(position,i));
  186.     list.set(position,y);
  187.     return i+1;
  188.   }
  189.   /**
  190.    * Swap two elements in an array
  191.    * @param array
  192.    * @param i
  193.    * @param j
  194.    */
  195.   private static <T extends Comparable<T>> void swap(ArrayList<T> list, int i, int j)
  196.   {
  197.     assert list!=null : "ArrayList should be initialized";
  198.     assert i>=0&&i<list.size() : "First index is invalid";
  199.     assert j>=0&&j<list.size() : "Second index is invalid";
  200.     T help=list.get(i);
  201.     list.set(i,list.get(j));
  202.     list.set(j,help);
  203.   }
  204.   /*************** Array based Sorting routines from lecture ***************/
  205.   /**
  206.    * Sorts an array in situ in ascending order using selection sort
  207.    * @param array
  208.    * @oaram length
  209.    */
  210.   static <T extends Comparable<T>> void selectionSort(ArrayList<T> list)
  211.   {
  212.     assert list!=null : "arrayList should be initialized";
  213.     for(int i=0;i<list.size();i++)
  214.     {
  215.       int j=indexOfSmallestValue(list,new Slice(i,list.size()));
  216.       swap(list,i,j);
  217.     }
  218.   }
  219.   /**
  220.    * Finds index of smallest value in array slice
  221.    * @param array
  222.    * @param slice
  223.    * @return index of smallest value
  224.    */
  225.   static <T extends Comparable<T>> int indexOfSmallestValue(ArrayList<T> list, Slice slice)
  226.   {
  227.     assert list!=null : "ArrayList should be initialized";
  228.     assert slice.isValid()&&slice.upto<=list.size() : "Slice should be valid";
  229.     assert slice.upto-slice.from>0 : "Slice should be non-empty";
  230.     int index=slice.from;
  231.     for(int i=slice.from+1;i<slice.upto;i++)
  232.       if(list.get(i).compareTo(list.get(index))<0)
  233.         index=i;
  234.     return index;
  235.   }
  236.   /**
  237.    * Sorts an array in situ in ascending order using bubble sort
  238.    * @param array
  239.    * @param length
  240.    */
  241.   static <T extends Comparable<T>> void bubbleSort(ArrayList<T> list)
  242.   {
  243.     assert list!=null : "arrayList should be initialized";
  244.     int length=list.size();
  245.     while(!bubble(list,new Slice(0,length)))
  246.       length--;
  247.  
  248.   }
  249.   /**
  250.    * Swap all adjacent pairs in the array slice that are not in the right order
  251.    * @param list
  252.    * @param slice
  253.    * @return array slice is sorted
  254.    */
  255.   static <T extends Comparable<T>> boolean bubble(ArrayList<T> list, Slice slice)
  256.   {
  257.     assert list!=null : "Array should be initialized";
  258.     assert slice.isValid()&&slice.upto<=list.size() : "Slice should be valid";
  259.     boolean isSorted=true;
  260.     for(int i=slice.from;i<slice.upto-1;i++)
  261.       if(list.get(i).compareTo(list.get(i+1))>0)
  262.       {
  263.         swap(list,i,i+1);
  264.         isSorted=false;
  265.       }
  266.     return isSorted;
  267.   }
  268.   /**
  269.    * Sorts an array in situ in ascending order using insertion sort
  270.    * @param array
  271.    * @param length
  272.    *
  273.    */
  274.   static <T extends Comparable<T>> void insertionSort(ArrayList<T> list)
  275.   {
  276.     assert list!=null : "arrayList should be initialized";
  277.     for(int i=0;i<list.size();i++)
  278.       insert(list,i,list.get(i));
  279.   }
  280. }
Add Comment
Please, Sign In to add comment