2013-03-06 59 views
7

Giả sử tôi có hai bộ so sánh, một bộ so sánh chính và phụ. Làm thế nào tôi có thể sắp xếp một mảng đầu tiên bằng so sánh chính, sau đó là thứ cấp?Sắp xếp mảng cho hai bộ so sánh?

Giả sử mỗi đối tượng có tên và trường số.

Giống như

Bob 1 
Bob 2 
Jack 1 
Jack 2 

Có thể mà không tạo ra một so sánh mới?

Trả lời

7

Có, bạn có thể thực hiện sắp xếp của mình mà không cần tạo c omparator.

well-known trick để sắp xếp theo trường chính, phụ, đại học, v.v. Đầu tiên sắp xếp theo trường ít quan trọng nhất (đại học), trường tiếp theo quan trọng (phụ) và cuối cùng là trường quan trọng nhất (chính) . Nhưng thuật toán sắp xếp cần phải là ổn định để tính năng này hoạt động.

Nếu bạn đang sắp xếp một mảng, hãy sử dụng Arrays.sort(). Nếu bạn đang phân loại List, hãy sử dụng Collections.sort(). Cả hai phương pháp này đều được đảm bảo ổn định.

Giả sử đối tượng so sánh chính của bạn được lưu trữ trong biến primaryComp và phụ của bạn ở số secondaryComp. Sau đó, đây là một số mã để thực hiện những gì bạn muốn:

Arrays.sort(mylist, secondaryComp); // This must come first! 
Arrays.sort(mylist, primaryComp); 
+0

Rất tốt. Tôi không biết về mẹo đó! – Jack

-1

So sánh bộ so sánh thứ hai trước tiên và sau đó so sánh đầu tiên. Tôi tin rằng nên làm các trick. Bạn có thể tạo một lớp để làm như vậy.

class FullName { 
    public String firstName; 
    public String secondName; 
} 

Giả sử bạn tạo một cái tên mới, được gọi là BobBobbins, gán giá trị và sau đó đơn giản so sánh tên thứ hai đầu tiên, và sau đó là tên đầu tiên. Bạn có thể có một hàm tĩnh để làm so sánh:

public static bool compareTo (FullName name1, FullName name2) { 
    // Algorithm here 
} 

bạn nên sử dụng một so sánh tĩnh, bạn có thể sẽ phải làm điều này: FullName.compareTo(BobBobbins, CharlieChaplin);

6

giả định lớp học của bạn là

class X { 
    String name; 
    int num; 
} 

sau đó sắp xếp sẽ là

Arrays.sort(x, new Comparator<X>() { 
     @Override 
     public int compare(X o1, X o2) { 
      if (o1.name.equals(o2.name)) { 
       return Integer.compare(o1.num, o2.num); 
      } 
      return o1.name.compareTo(o2.name); 
     }}); 
Các vấn đề liên quan