James111
James111

Reputation: 15903

Having trouble sorting array list alphabetically

I've been having trouble being able to sort my outputs into alphabetical order (by the name). I've tried a few methods, they've been commented out. The latest method I tried is the bubble sort.

My program is writing all the inputs to a binary file and then reading them when the user wants to output them. So basically when the user clicks the number 5, it will run the sortEmployees() method and then display the records in alphabetical order, but at the moment I haven't found a way to do that.

I'm not confident with array lists, I haven't used them that much...So I'm almost certain im using the wrong methods. Im not using the latest JDK I believe. I've also looked at different questions on stack + google and can't really find much that helps.

Output at the moment is as follows:

  1. 1, Johnson, 80000.00
  2. 2 So on...
  3. 3 and so on... As they've been entered below.

I'll add all my code below, so you can have a look at it.

EmployeeFileDriver.java

    java.io.*;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    import javax.swing.JOptionPane;


    public class EmployeeFileDriver
    {   
        private static ArrayList<Employee> list = new ArrayList<>();

        public static void main(String args[]) throws IOException
        {
            final int QUIT_MAIN_MENU = 4;
            String fileName = "Employee.txt";

            readEmployeeFile(fileName);
            //sample records
            list.add(new Employee(1, "Johnson", 80000.00));
            list.add(new Employee(2, "Singh",  75000.00));
            list.add(new Employee(3, "Smith", 63000.00));
            list.add(new Employee(4, "Jones", 52000.00));

            int choice = mainMenu();

            while(choice != QUIT_MAIN_MENU)  
            {
                switch (choice)
                {
                    case 1:
                        list.add(inputEmployee());
                        break;
                    case 2:
                        searchID();
                        break; 
                    case 3:
                        listAllEmployees();
                        break;   
                    case 5:
                        sortEmployees(list[]);
                        break;
                } //end switch (choice)  

                choice = mainMenu();  // recall mainMenu()
            } // end while

            saveEmployeeFile(fileName);  //save objects to file before closing
            System.out.println("Records saved to file");
        }

        public static int mainMenu()
        {
            String heading, menu, userSelection;

            heading = "<h3><u>EMPLOYEE SYSTEM</u></h3>";

            menu =  "<HTML><center>" + heading + "<hr><h2><u>Main Menu</u></h2><br /><table>" + 
                    "<tr><td>1.  Enter Employee Details</td></tr>" +
                    "<tr><td>2.  Search Employee ID</td></tr>" + 
                    "<tr><td>3.  List all Employees</td></tr>" +
                    "<tr><td>4.  Save and Exit</td></tr>" +
                    "<tr><td>5.  Sort alphabetically</td></tr>" +
                    "</table><br /><hr></center></HTML>" +
                    "\nEnter Selection: ";

            //get user selection for main menu
            userSelection = JOptionPane.showInputDialog(null , menu,"Input",  
                            JOptionPane.PLAIN_MESSAGE);

            int option = Integer.parseInt(userSelection);

            //return option to main method
            return option;
        }

        public static void readEmployeeFile(String fileName)
        {
            try 
            {
               //open InputFile
                FileInputStream fiStream = new FileInputStream(fileName);
                ObjectInputStream inStream = new ObjectInputStream(fiStream);

                list = (ArrayList)inStream.readObject();  //read whole ArrayList object 
                                                          //rather than individual Employee objects

                System.out.println("\tEMPLOYEE LIST (from File)");
                System.out.println("ID    \t   Name   \t    Salary\n");
                for(Employee e: list)
                {
                    System.out.printf("%-10d %-16s $%8.2f\n", e.getID(), 
                                            e.getName(), e.getSalary());
                }           
                inStream.close();
            }
            catch (FileNotFoundException e) 
            {
                System.err.println("Could not open file\n" + e.toString());
            }
            catch (ClassNotFoundException e)
            {
                System.err.println("Class not found \n" + e.toString());
            }
            catch (IOException e) 
            {
                System.err.println("Employee file: \n" + e.toString());
            }   
        }

        //save employee objects to file on exit
        public static void saveEmployeeFile(String fileName)
        {
            try
            {
                //open OutputFile
                FileOutputStream foStream = new FileOutputStream(fileName);
                //FileWriter fw = new FileWriter(fileName);
                ObjectOutputStream outStream = new ObjectOutputStream(foStream);

                outStream.writeObject(list);  //save whole ArrayList object to file

                outStream.close();                      
            }
            catch (FileNotFoundException e)
            {
                System.out.println("Could not open file\n" + e.toString());
            }
            catch(IOException e)
            {
                System.out.println("I/O error\n" + e.toString());
            }
        }

        public static Employee inputEmployee()
        {
            int id;
            String name;
            double salary;
            Employee emp;

            id = Integer.parseInt(
                   JOptionPane.showInputDialog(null , "Enter employee ID"));
            name = JOptionPane.showInputDialog(null , "Enter employee name");
            salary = Double.parseDouble(
                   JOptionPane.showInputDialog(null , "Enter employee salary"));
            emp = new Employee(id, name, salary);

            return emp;
        }

        public static void searchID()
        {
            int id;
            boolean found = false;

            id = Integer.parseInt(
                  JOptionPane.showInputDialog(null, "Enter employee ID to search"));

            for(Employee e: list)
            {
                if(id == e.getID())
                {
                    JOptionPane.showMessageDialog(null, e.toString());
                    found = true;
                }
            }
            if(found == false)
               JOptionPane.showMessageDialog(null, "Employee ID not found"); 
        }

        public static void listAllEmployees()
        {
            String output = "";

            for(Employee e: list)
            {
                output += e.toString();
            }

            JOptionPane.showMessageDialog(null, output);
        }

    //    public void sortEmployees(){
    //        //Collections.sort(list, (e1, e2) -> e1.getname().compareTo(e2.id()));
    //        //[list sortUsingSelector:@selector(caseInsensitiveCompare:)];
    //            Collections.sort(list, new Comparator<Employee>()
    //            {
    //                @Override
    //                public int compare(String name)
    //                {
    //                    return name.compareToIgnoreCase("ABCDE");
    //                }
    //            });
    //    }
        public static void sortEmployees()
        {

            int j;
                boolean flag = true;  // will determine when the sort is finished
                String temp;

                while ( flag )
                {
                      flag = false;
                      for ( j = 0;  j < list.length - 1;  j++ )
                      {
                              if ( list [ j ].compareToIgnoreCase( list [ j+1 ] ) > 0 )
                              {                                             // ascending sort
                                          temp = list [ j ];
                                          list [ j ] = list [ j+1];     // swapping
                                          list [ j+1] = temp; 
                                          flag = true;
                               } 
                       } 
          } 
            String output = "";
            for(String e: list)
            {
                output += e.toString();
            }

            JOptionPane.showMessageDialog(null, output);
        }    
    }

Employee.java

    public class Employee 
    {

        private int id;
        private String name;
        private double salary;


        public Employee (int id, String name,  double salary) 
        {
            this.id = id;
            this.name = name;
            this.salary = salary;   
        }

        public void setName(String name)
        {
            this.name = name;
        }

        public String getName()
        {
            return this.name;
        }

        public double getSalary()
        {
            return this.salary;
        }

        public int getID()
        {
            return this.id;
        }

        public String toString()
        {
            return "\nID_NO:\t"+id+"\nNAME:\t"+name+"\nSALARY\t"+salary+"\n"; 
        }

    }

Upvotes: 1

Views: 821

Answers (2)

T.Gounelle
T.Gounelle

Reputation: 6033

This should do the job.

static List<Employee> list = new ArrayList<>();

static void sortEmployees() {
    list.sort(new Comparator<Employee>() {

        @Override
        public int compare(Employee e1, Employee e2) {
            return e1.getName().compareTo(e2.getName());
        }});
}

Note list.sort(...) is available since Java 8. For Java 7 and before use Collections.sort(list, new Comparator<Employee>() {...});


With java8 streams, if you want to keep the original order:

List<Employee> sortedList = list.stream()
            .sorted((e1, e2) -> e1.getName().compareTo(e2.getName()))
            .collect(Collectors.toList());

Another variant is to have Employee implements the Comparable interface and use the natural ordering on Employee objects (as you define it - which is alphabetic order on names):

public class Employee implements Comparable {

    @Override
    public int compareTo(Object o) {
        Employee e = (Employee)o;
        return name.compareTo(e.getName());
    }

    // ...
}

Then you can just do (Java 8):

static void sortEmployees() {
    list.sort(null); // passing a null Comparator => use natural order
}

Or in Java 7 and before:

static void sortEmployees() {
    Collections.sort(list);
}

Upvotes: 1

Ranjitsinh
Ranjitsinh

Reputation: 1339

If you want to sort the all object by name then you need to use Comparator or Camparable interface.

public class Employee implements Comparable<Employee>{

}

Also you need to override compareto method.

@Override
        public int compare(Employee o1, Employee o2) {
            return o1.name.compareTo(o2.name);
        }

Check following links for more details.

http://javarevisited.blogspot.in/2014/01/java-comparator-example-for-custom.html

http://www.tutorialspoint.com/java/java_using_comparator.htm

Hope it may help you.!!

Upvotes: 0

Related Questions