Возникли проблемы при сортировке списка массивов по алфавиту

1

У меня возникли проблемы с возможностью sort my outputs into alphabetical order (по имени). Я пробовал несколько methods, они были прокомментированы. Последний метод, который я пробовал, - это bubble sort.

Моя программа записывает все входы в двоичный файл, а затем читает их, когда пользователь хочет их вывести. Поэтому, когда пользователь нажимает номер 5, он run метод sortEmployees() а затем отображает записи в алфавитном порядке, но на данный момент я не нашел способ сделать это.

Я не уверен в списках массивов, я не использовал их так много... Поэтому я почти уверен, что использую неправильные methods. Я не использую последний JDK, я считаю. Я также рассмотрел разные вопросы о стеке + google и не могу найти много полезного.

Выход на данный момент выглядит следующим образом:

  1. 1, Johnson, 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"; 
        }

    }
  • 0
    Вы пробовали: Collections.sort ()? уже?
  • 1
    Вы не должны реализовывать алгоритм сортировки самостоятельно; просто реализуйте Comparable для вашего объекта и используйте Collections.sort
Показать ещё 1 комментарий
Теги:
arrays
arraylist
sorting

2 ответа

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

Примечание 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);
}
0

Если вы хотите отсортировать все объекты по имени, вам необходимо использовать интерфейс Comparator или Camparable.

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

Надеюсь, это может вам помочь. !!

  • 0
    Привет @Ranjitsinh Я уверен, что это работает, но метод AbbeResina работал очень хорошо! Я не пробовал твой.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню