Main Content

Java, sorting, ArrayList example, generics

Archive - Originally posted on "The Horse's Mouth" - 2008-01-11 07:37:13 - Graham Ellis

A Java ArrayList holds an ordered sequence of items like an array, but there are differences:

1. An ArrayList has no fixed size but can be extended by adding elements later
2. An ArrayList can only hold objects (not primitives)
3. ArrayList elements are addressed by methods and not by square bracket notation.

Here's an example from yesterday - showing a typical use of an ArrayList; I was reading a file but didn't know how many lines it contained, so an ArrayList gave me the flexibility I needed.

import java.io.*;
import java.util.*;
 
public class Pesort {
 
public static void main (String [] args) throws Exception {
 
   // Following line up to Java 1.4 then gives warnings
   //ArrayList Stuff = new ArrayList();
 
   // OR following line from Java 1.5;
   // this specifies that the ArrayList is to contain Strings
 
   ArrayList <String> Stuff = new ArrayList<String>();
 
   // Above lines show use of "Generics" - compare to
   // Templates in C++
 
   BufferedReader Source = new BufferedReader(
      new FileReader("../request.txt"));
 
   System.out.println("---------- UnSorted");
 
   while (Source.ready() ) {
      String Line = Source.readLine();   
      System.out.println(Line);
      Stuff.add(Line);
      }
 
   System.out.println("---------- Alphabetic Sort");
   
   Collections.sort(Stuff);
 
   Iterator stepper = Stuff.iterator();
   while (stepper.hasNext()) {
      String current = (String)stepper.next();
      System.out.println(current);
      }
   
 
   System.out.println("---------- Sort by line length");
 
   Collections.sort(Stuff, new byLineLength());
 
   stepper = Stuff.iterator();
   while (stepper.hasNext()) {
      String current = (String)stepper.next();
      System.out.println(current);
      }
   }
 
}


Here are the results from running that program:


[trainee@snowdrop java08]$ java Pesort
---------- UnSorted
antonia Perl XML PHP Tcl/Tk MySQL
barbara Tcl/Tk ASP Ruby Java
cherry Perl Java Ruby MySQL
delia XML PHP Java ASP
florence Ruby PHP Java ASP
gloria XML Perl Tcl/Tk MySQL
zoe Ruby ASP Perl PHP
adam Tcl/Tk Perl Python MySQL
barry Python XML Java Perl PHP
charles Perl Ruby MySQL Tcl/Tk
ed Ruby Perl Java PHP
fred MySQL Perl Java XML
graham Java Perl Tcl/Tk
harry PHP Python Java
ivan Ruby Java Perl Tcl/Tk MySQL
victor Ruby Perl Tcl/Tk MySQL
william Ruby Perl PHP
xavier PHP Java Perl
yuri XML PHP Perl Tcl/Tk
zachary MySQL Java Tcl/Tk
---------- Alphabetic Sort
adam Tcl/Tk Perl Python MySQL
antonia Perl XML PHP Tcl/Tk MySQL
barbara Tcl/Tk ASP Ruby Java
barry Python XML Java Perl PHP
charles Perl Ruby MySQL Tcl/Tk
cherry Perl Java Ruby MySQL
delia XML PHP Java ASP
ed Ruby Perl Java PHP
florence Ruby PHP Java ASP
fred MySQL Perl Java XML
gloria XML Perl Tcl/Tk MySQL
graham Java Perl Tcl/Tk
harry PHP Python Java
ivan Ruby Java Perl Tcl/Tk MySQL
victor Ruby Perl Tcl/Tk MySQL
william Ruby Perl PHP
xavier PHP Java Perl
yuri XML PHP Perl Tcl/Tk
zachary MySQL Java Tcl/Tk
zoe Ruby ASP Perl PHP
---------- Sort by line length
xavier PHP Java Perl
ed Ruby Perl Java PHP
harry PHP Python Java
william Ruby Perl PHP
zoe Ruby ASP Perl PHP
delia XML PHP Java ASP
graham Java Perl Tcl/Tk
fred MySQL Perl Java XML
yuri XML PHP Perl Tcl/Tk
zachary MySQL Java Tcl/Tk
florence Ruby PHP Java ASP
cherry Perl Java Ruby MySQL
barbara Tcl/Tk ASP Ruby Java
gloria XML Perl Tcl/Tk MySQL
adam Tcl/Tk Perl Python MySQL
victor Ruby Perl Tcl/Tk MySQL
barry Python XML Java Perl PHP
charles Perl Ruby MySQL Tcl/Tk
ivan Ruby Java Perl Tcl/Tk MySQL
antonia Perl XML PHP Tcl/Tk MySQL
[trainee@snowdrop java08]$


And here is the comparator class that I wrote for my non-standard sort. Using a comparator class, the programmer can provide a method which is used internally by the sort method to compare two items and return an integer - negative, nought or positive - to indicate if the first object comes first in sequence, the objects have the same tank, or it comes second.

public class byLineLength implements java.util.Comparator {
 public int compare(Object boy, Object girl) {
  int sdif = ((String)boy).length() - ((String)girl).length();
  return sdif;
 }
}