无法按字母顺序排序数组列表

时间:2015-03-26 09:14:48

标签: java arrays sorting arraylist

我一直无法sort my outputs into alphabetical order(以名字命名)。我已经尝试了一些methods,他们已被评论出来。我尝试过的最新方法是bubble sort

我的程序正在将所有输入写入二进制文件,然后在用户想要输出它们时读取它们。所以基本上当用户点击数字5时,它会run sortEmployees()方法,然后按字母顺序显示记录,但目前我还没有找到方法。

我对数组列表没有信心,我还没有那么多使用它们......所以我几乎可以肯定我使用了错误的methods。我不相信使用最新的JDK。我还在堆栈+谷歌上查看了不同的问题,并且真的找不到有用的东西。

此刻的输出如下:

  1. 1,Johnson,80000.00
  2. 2所以......
  3. 3等等......因为它们已经输入到下面。
  4. 我将在下面添加我的所有代码,以便您查看它。

    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"; 
            }
    
        }
    

2 个答案:

答案 0 :(得分:1)

这应该可以胜任。

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());
        }});
}

自Java 8以来,注意list.sort(...)可用。对于Java 7和使用前Collections.sort(list, new Comparator<Employee>() {...});


使用java8流,如果要保留原始顺序:

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

另一个变体是让Employee实现Comparable接口,并在Employee对象上使用自然排序(当你定义它时 - 这是字母顺序在名字上):

public class Employee implements Comparable {

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

    // ...
}

然后你可以做(​​Java 8):

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

或者在Java 7及之前:

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

答案 1 :(得分:0)

如果您想按名称对所有对象进行排序,则需要使用 Comparator 广告系列界面。

public class Employee implements Comparable<Employee>{

}

您还需要覆盖 compareto 方法。

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

查看以下链接以获取更多详细信息。

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

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

希望它可以帮助你。!!