繁体   English   中英

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

[英]Having trouble sorting array list alphabetically

我一直无法将sort my outputs into alphabetical order (按名称) sort my outputs into alphabetical order 我尝试了几种methods ,但已将其注释掉。 我尝试过的最新方法是bubble sort

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

我对数组列表不确定,我没有使用太多...所以我几乎可以肯定我使用了错误的methods 我没有使用最新的JDK。 我也在堆栈+ google上查看了不同的问题,但实际上找不到很多帮助。

目前的输出如下:

  1. 1,约翰逊,80000.00
  2. 2等等...
  3. 3,依此类推...如下所述。

我将在下面添加所有代码,因此您可以看一下。

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

    }

这应该做的工作。

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

注意list.sort(...)从Java 8开始可用。对于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);
}

如果要按名称对所有对象排序,则需要使用ComparatorCamparable接口。

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

希望对您有帮助!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM