Reputation: 15903
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:
I'll add all my code below, so you can have a look at it.
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);
}
}
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
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
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