Java中的DSA - 物件排序



使用java.util.Arrays.sort()方法可以輕鬆對Java物件進行排序。請考慮以下示例。

ObjectSortingDemo.java

package com.tutorialspoint.simplesort;

public class ObjectSortingDemo {

   public static void main(String[] args){

      /* array of String objects */
      String[] employees 
      = new String[] {"Robert", "Paul","John","Micheal" };

      System.out.println("Unsorted Array : " 
         + Arrays.toString(employees));

      /* sort array in lexicographical order */
      Arrays.sort(employees);       

      System.out.println("Sorted Array : " 
         + Arrays.toString(employees));
      System.out.println();
   }
}   

如果我們編譯並執行上述程式,則會產生以下結果

Unsorted Array : [Robert, Paul, John, Micheal]
Sorted Array : [John, Micheal, Paul, Robert]

使用Comparable介面

為了排序物件,其類可以實現java.lang.Comparable介面。請考慮以下程式碼。

Employee.java

package com.tutorialspoint.simplesort;

public class Employee implements Comparable<Employee> {
    
   private int employeeId;
   private String name;
   private String department;

   public Employee (int employeeId,String name, String department){
      this.employeeId = employeeId;
      this.name = name;
      this.department = department;
   }

   @Override
   public int compareTo(Employee employee) {
      return employeeId - employee.employeeId;
   }

   public String getName(){
      return name;
   }

   public String getDepartment(){
      return department;
   }

   @Override
   public String toString() {
      return "\n[ " + employeeId
         +"," + name
         +"," + department
         +" ]";
   }    
}

這裡Employee類實現了java.lang.Comparable介面,並具有compareTo()方法。Array.sort()使用歸併排序演算法,並使用此compareTo()方法來比較兩個物件,以便對作為引數傳遞的物件陣列進行排序。

ObjectSortingDemo.java

public class ObjectSortingDemo {

   public static void main(String[] args){

      /* Use of Arrays.sort() method to sort array */
      Employee[] employeesObjects = new Employee[] {
         new Employee(100, "Robert", "Finance"),
         new Employee(30, "Paul", "Finance"),
         new Employee(50, "John", "Finance"),
         new Employee(12, "Micheal", "Finance")
      };

      System.out.println("Unsorted Array : " 
         + Arrays.toString(employeesObjects));
      Arrays.sort(employeesObjects);  
      System.out.println();	  
      System.out.println("Sorted Array by id: " 
         + Arrays.toString(employeesObjects));      
   }
}   

如果我們編譯並執行上述程式,則會產生以下結果:

Unsorted Array : [
[ 100,Robert,Finance ],
[ 30,Paul,Finance ],
[ 50,John,Finance ],
[ 12,Micheal,Finance ]]

Sorted Array by id: [
[ 12,Micheal,Finance ],
[ 30,Paul,Finance ],
[ 50,John,Finance ],
[ 100,Robert,Finance ]]

使用Comparator介面

使用java.util.Comparator介面可以讓我們精確控制物件的排序。正如我們在之前的示例中看到的,我們透過實現java.lang.Comparable介面設定了一個標準,即員工應該根據類中的compareTo()方法進行排序。使用Comparator類,如果一個類沒有實現Comparable介面,我們可以在不修改類的情況下設定一個標準。請考慮以下程式碼。

Employee.java

package com.tutorialspoint.simplesort;

public class Employee {
    
   private int employeeId;
   private String name;
   private String department;

   public Employee (int employeeId,String name, String department){
      this.employeeId = employeeId;
      this.name = name;
      this.department = department;
   }   

   public String getName(){
      return name;
   }

   public String getDepartment(){
      return department;
   }

   @Override
   public String toString() {
      return "\n[ " + employeeId
         +"," + name
         +"," + department
         +" ]";
   }    
}

定義一個可以根據員工姓名比較兩個員工的比較器。

EmployeeNameComparator.java

package com.tutorialspoint.simplesort;

import java.util.Comparator;

public class EmployeeNameComparator implements Comparator<Employee> {
   @Override
   public int compare(Employee employee1, Employee employee2) {
      return employee1.getName().compareTo(employee2.getName());
   }    
}

這裡EmployeeNameComparator類實現了java.util.Comparator介面,並具有compare()方法。Array.sort()使用歸併排序演算法,並使用此compare()方法來比較兩個物件,以便對作為引數傳遞的物件陣列進行排序。

ObjectSortingDemo.java

public class ObjectSortingDemo {

   public static void main(String[] args){

      /* Use of Arrays.sort() method to sort array  */
      Employee[] employeesObjects = new Employee[] {
         new Employee(100, "Robert", "Finance"),
         new Employee(30, "Paul", "Finance"),
         new Employee(50, "John", "Finance"),
         new Employee(12, "Micheal", "Finance")
      };

      System.out.println("Unsorted Array : " 
         + Arrays.toString(employeesObjects));
      Arrays.sort(employeesObjects,new EmployeeNameComparator());   
      System.out.println();
      System.out.println("Sorted Array by name: " 
         + Arrays.toString(employeesObjects));      
   }
}   

如果我們編譯並執行上述程式,則會產生以下結果:

Unsorted Array : [
[ 100,Robert,Finance ], 
[ 30,Paul,Finance ], 
[ 50,John,Finance ], 
[ 12,Micheal,Finance ]]

Sorted Array by name: [
[ 50,John,Finance ], 
[ 12,Micheal,Finance ], 
[ 30,Paul,Finance ], 
[ 100,Robert,Finance ]]
廣告